我是编程新手,
按MSDN
装箱是将值类型转换为类型对象或此值类型实现的任何接口类型的过程。当CLR框选值类型时,它将值包装在System.Object中并将其存储在托管堆中。取消装箱将从对象中提取值类型。装箱是隐式的;拆箱是显式的。
我知道我们可以把任何对象存储在一个数组中,因为system.object
是所有类型的基础。装箱和拆箱发生在数组列表中。我同意。
装箱和拆箱会在一个数组中发生吗?因为我们可以创建如下的对象数组
object[] arr = new object[4] { 1, "abc", 'c', 12.25 };
我的理解是不是拳击和开膛都是在这样的阵型中发生的?
最佳答案
装箱和拆箱会在一个数组中发生吗?
数组本身已经是引用类型,数组本身没有装箱。但是,由于某些元素是值类型(int
、double
和char
),并且数组类型是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
关于c# - 装箱和拆箱会在阵列中发生吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37371228/