Will Boxing and Unboxing happen in Array?

后端 未结 3 1049
礼貌的吻别
礼貌的吻别 2020-12-20 12:19

I\'m new to programming,

As per MSDN,

Boxing is the process of converting a value type to the type object or to any interface type impleme

相关标签:
3条回答
  • 2020-12-20 12:59

    Every time you assign a value of a value type to a variable of type object a boxing operation will occur, So when you do:

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

    Which is equivalent to

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

    Three boxes will be created to store 1, 12.25 and 'c' because they are values of value types.

    0 讨论(0)
  • 2020-12-20 13:01

    Will boxing and unboxing happens in an array?

    The Array itself is already a reference type, there is no boxing on the array itself. But, as some of your elements are value types (int, double and char), and your array type is object, a boxing will occur for the said element. When you'll want to extract it, you'll need to unbox it:

    var num = (int)arr[0];
    

    You can see it in the generated 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
    
    0 讨论(0)
  • 2020-12-20 13:04

    Yes, value type elements (1, 'c' and 12.25) will be boxed when placed into array of object[].

    String "abc" will be placed as is since it is reference type object.

    0 讨论(0)
提交回复
热议问题