拆箱装箱的操作存在于这样的scenario,将值类型的对象和引用类型的对象相互赋值的时候,此时会存在堆上的内容和栈上的内容相互交换的过程。
装箱时在堆上分配新内存,然后把栈上的内容拷贝到堆上。
而拆箱本身只是获取一个指针的过程,这个指针是指向堆上装箱对象中那个未装箱的部分。在此,通过作者的描述,我就很好奇所谓的装箱拆箱,对于内存是如何安排的,我猜测,它应该就是给加了个盖,其实装箱的东西必须要拆箱才能操作的。我很好奇这一段的,我想是有办法能够获知它究竟是怎么干的,那就是看IL代码,所以我决定,实践一下!
实践结果,尼玛,果然是个操作系统。。。。
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 19 (0x13)
.maxstack 1
.locals init ([0] int32 i,
[1] object o,
[2] int32 b)
IL_0000: nop
IL_0001: ldc.i4.s 10
IL_0003: stloc.0
IL_0004: ldloc.0
IL_0005: box [mscorlib]System.Int32
IL_000a: stloc.1
IL_000b: ldloc.1
IL_000c: unbox.any [mscorlib]System.Int32
IL_0011: stloc.2
IL_0012: ret
} // end of method Program::Main
看看IL代码乐趣多。
有很多方法会有很多重载,这些重载的形参类型大都是值类型,之所以这样,就是为了减少装箱拆箱操作的次数,提升性能,降低内存开销。
效率不高,心不静,所以看得时间不算短,但效率比较低。撤退,明天补上。