装箱的过程为:
1. 分配内存:
在托管堆中分配好内存,内存的大小是值类型的各个字段需要的内存量加上托管堆的所有对象都有的两个额外成员—类型对象指针和同步块索引—所需要的内存量之和。
2. 复制对象:
将值类型的字段复制到新分配的内存中。
3. 返回地址:
将已装箱的值类型对象的地址返回给引用类型的变量。
拆箱的过程为:
1.
检查实例:首先检查变量的值是否为null,如果是则抛出NullReferenceException异常;再检查变量的引用指向的对象是不是给定值类型的已装箱对象,如果不是,则抛出InvalidCastException异常。
2.
返回地址:返回已装箱实例中属于原值类型字段的地址,而两个额外成员(类型对象指针和同步块索引)则不会返回。
到此,拆箱过程已经结束,但是伴随着拆箱,“往往”(《CLR
via
C#》中的描述,用的是”往往“,而并没有说一定,但是我带目前为止也不知道有没有一种拆箱没有伴随字段复制)会紧接着发生一次字段的复制操作。实际上就是讲已装箱对象中的实例字段拷贝到内存栈上。
装箱和拆箱的概念和原理,布布扣,bubuko.com
装箱和拆箱的概念和原理
原文:http://www.cnblogs.com/Rikybk/p/3600685.html