严格地讲,拆箱操作不会拷贝任何字段.但通常情况下,拆箱操作后会紧跟着一个字段拷贝操作,将字段从托管堆拷贝到堆栈中。实际上,在C#中,拆箱操作总是紧跟着一个字符拷贝操作.看下面的代码:
static void Main(){
Point p;
p.x=p.y=1;
Object o=p; //对p进行装箱;o指向已装箱对象
p=(point)o; //对o进行拆箱,并将字段从托管堆拷贝到堆栈上
}
对于上面最后一行代码,C#编译器会产生一个对o执行拆箱操作的IL指令(获取对象中属于值类型部分的字段地址),以及另一个将字段从托管堆拷贝到堆栈变量p上的IL指令.