当发生取消装箱时,盒装值的副本会转换为适当的变量类型,但在堆上的盒装副本的内存位置会发生什么。 盒装副本是否保留在该位置并覆盖堆上的内存?
答案 0 :(得分:4)
盒装副本是否保留在该位置并覆盖堆上的内存?
是。毕竟,可能还有其他参考:
object o1 = 5;
object o2 = o1;
int x = (int) o1;
x = 10;
Console.WriteLine(o2); // Still 5
当没有更多强引用时,盒装值就像普通对象一样有资格进行垃圾收集。
答案 1 :(得分:3)
是的,当然,在取消装箱时,原件始终不受影响。
在IL级别下,有两个用于取消装箱的操作码:unbox.any
和unbox
。
根据MSDN,regarding unbox.any
:
当应用于盒装形式的时候 值类型,unbox.any指令 提取其中包含的值 obj(O型),因此 相当于unbox后跟ldobj。
[...] unbox不需要复制 来自对象的值类型。 通常它只是计算 值的类型的地址 已经存在于盒装内部 对象
因此,可能会或可能不会复制原始值,但原始值始终不受影响。