拆箱机制

时间:2016-05-27 16:49:59

标签: c# casting reference boxing unboxing

当发生取消装箱时,盒装值的副本会转换为适当的变量类型,但在堆上的盒装副本的内存位置会发生什么。 盒装副本是否保留在该位置并覆盖堆上的内存?

2 个答案:

答案 0 :(得分:4)

  

盒装副本是否保留在该位置并覆盖堆上的内存?

是。毕竟,可能还有其他参考:

object o1 = 5;
object o2 = o1;
int x = (int) o1;
x = 10;
Console.WriteLine(o2); // Still 5

当没有更多强引用时,盒装值就像普通对象一样有资格进行垃圾收集。

答案 1 :(得分:3)

是的,当然,在取消装箱时,原件始终不受影响。

在IL级别下,有两个用于取消装箱的操作码:unbox.anyunbox

根据MSDN,regarding unbox.any

  

当应用于盒装形式的时候   值类型,unbox.any指令   提取其中包含的值   obj(O型),因此   相当于unbox后跟ldobj。

regarding unbox

  

[...] unbox不需要复制   来自对象的值类型。   通常它只是计算   值的类型的地址   已经存在于盒装内部   对象

因此,可能会或可能不会复制原始值,但原始值始终不受影响。