【问题标题】:Will Boxing and Unboxing happen in Array?装箱和拆箱会在 Array 中发生吗?
【发布时间】:2016-05-22 06:22:08
【问题描述】:

我是编程新手,

根据MSDN

装箱是将值类型转换为类型对象或此值类型实现的任何接口类型的过程。当 CLR 将值类型装箱时,它会将值包装在 System.Object 中并将其存储在托管堆中。拆箱从对象中提取值类型。拳击是隐含的;拆箱是明确的。

我知道我们可以在数组列表中存储任何对象,因为system.object 是所有类型的基础。装箱和拆箱发生在数组列表中。我同意这一点。

装箱和拆箱会在数组中进行吗?因为我们可以像下面这样创建对象数组

object[] arr = new object[4] { 1, "abc", 'c', 12.25 };

我对在这样的数组中进行装箱和拆箱的理解是否正确?

【问题讨论】:

  • 这里没有装箱,因为您的数组已经是对象类型。在这种情况下没有什么可以装箱的。
  • @Zohar - 但是对象类型是数组列表的默认类型,但是装箱和拆箱发生在那里
  • 你为什么说这里没有拳击,因为这里的类型是对象,拳击应该发生吧?
  • @ZoharPeled 你确定吗?那么值类型是如何存储在对象中的呢?在这种特殊情况下,您需要为值 1、'c' 和 12.25 进行 3 次装箱操作
  • 阅读 Yuval 的回答,这就是我的意思 - 数组本身不会导致装箱,将整数、字符串、字符和浮点数分配到对象中当然是装箱,而是一个明确的装箱。

标签: c# arrays boxing


【解决方案1】:

装箱和拆箱会在数组中进行吗?

数组本身已经是一个引用类型,数组本身没有装箱。但是,由于您的某些元素是值类型(intdoublechar),并且您的数组类型是 object,因此该元素会发生装箱。当您想要提取它时,您需要将其拆箱:

var num = (int)arr[0];

你可以在生成的IL中看到:

IL_0000: ldarg.0
IL_0001: ldc.i4.4
IL_0002: newarr [mscorlib]System.Object
IL_0007: dup
IL_0008: ldc.i4.0
IL_0009: ldc.i4.1
IL_000a: box [mscorlib]System.Int32 // Boxing of int
IL_000f: stelem.ref
IL_0010: dup
IL_0011: ldc.i4.1
IL_0012: ldstr "abc"
IL_0017: stelem.ref
IL_0018: dup
IL_0019: ldc.i4.2
IL_001a: ldc.i4.s 99
IL_001c: box [mscorlib]System.Char
IL_0021: stelem.ref
IL_0022: dup
IL_0023: ldc.i4.3
IL_0024: ldc.r8 12.25
IL_002d: box [mscorlib]System.Double
IL_0032: stelem.ref
IL_0033: stfld object[] C::arr
IL_0038: ldarg.0
IL_0039: call instance void [mscorlib]System.Object::.ctor()
IL_003e: nop
IL_003f: ret

【讨论】:

    【解决方案2】:

    是的,值类型元素(1、'c' 和 12.25)在放入 object[] 数组时将被装箱。

    字符串“abc”将按原样放置,因为它是引用类型的对象。

    【讨论】:

      【解决方案3】:

      每次你将一个值类型的值赋给object类型的变量时,都会发生装箱操作,所以当你这样做时:

      object[] arr = new object[4] { 1, "abc", 'c', 12.25 };
      

      相当于

      object[] arr = new object[4];
      arr[0] = 1;
      arr[1] = "abc";
      arr[2] = 'c';
      arr[3] = 12.25
      

      将创建三个盒子来存储112.25'c',因为它们是值类型的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-19
        • 2011-02-28
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多