2016-05-27 84 views
5

拆箱發生時,將裝箱值的副本轉換爲適當的變量類型,但在堆上的裝箱副本的內存位置會發生什麼情況。 盒裝副本是否保留在該位置並覆蓋堆上的內存?拆箱機制

回答

4

盒裝副本是否保留在該位置並覆蓋堆上的內存?

是的。畢竟,有可能是其他引用它:

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

盒裝值像普通對象,在被符合垃圾收集條件時,有沒有給他們更多的強引用。

3

是的,當然,拆箱時,原件始終不受影響。

在IL級別下,有兩個拆箱操作碼:unbox.anyunbox

根據MSDN,regarding unbox.any

當應用於 值類型的盒裝形式中,unbox.any指令 提取包含內 OBJ(類型O)的值,因此是 相當於unbox後跟ldobj。

regarding unbox

[...]是不需要拆箱從對象複製 值類型。 通常,它只是計算 對象中已存在的值類型 的地址。

因此,原始值的副本可能會也可能不會被創建,但原始值始終不受影響。