容易被忽视的装箱问题

测试代码:(不知道怎么回事,粘贴不了代码)

分析如下:

说明:左侧为栈,右侧为堆。

注意:在(Angle)objectAngle中,执行了拆箱动作(获取对象objAngle中属于值类型Angle部分的字段地址),然后在IL的演算堆栈中创建一个临时的Angle值类型实例,该值类型接受一份objectAngle当前所引用对象的属于Angle值类型部分(也可称作‘未装箱部分’)的数据拷贝,并未发生数据到“通常意义上的栈”(我不知道此处如何表达,暂且写成“通常意义上的栈”,自己先慢慢理解)的复制。实际上,拆箱指令并不包括将数据复制回栈的动作。(装箱包括数据复制到堆的动作)

第四种,向IAngle的转型是伴随已经在堆上的数据发生的,所以不会发生复制动作。通过接口访问已装箱的值时,不需要进行复制。

原文地址:https://www.cnblogs.com/2008freestyle/p/2466258.html