裝箱用於在託管內存中存儲值類型。 裝箱是值類型到 object 類型或到此值類型所實現的任何接口類型的隱式轉換。 對值類型裝箱會在堆中分配一個對象實例,並將該值複製到新的對象中。
如: int i = 123; object o = i;
此語句的結果是在堆棧上創建對象引用 o,而在堆上則引用 int 類型的值。 該值是賦給變量 i 的值類型值的一個副本。
下圖說明了兩個變量 i 和 o 之間的差異。
也可以進行顯式裝箱,但顯式裝箱不是必需的:
如:i = 123; object o = (object)i;
取消裝箱是從 object 類型到值類型或從接口類型到實現該接口的值類型的顯式轉換。
取消裝箱操作包括:
1.檢查對象實例,以確保它是給定值類型的裝箱值。
2.將該值從實例複製到值類型變量中。
如:i = 123; object o = i; int j = (int)o;
下圖演示上述語句的結果。
取消裝箱轉換
注意:
要在運行時成功取消裝箱值類型,被取消裝箱的項必須是對一個對象的引用,該對象是先前通過裝箱該值類型的實例創建的。 嘗試取消裝箱 null 會導致 NullReferenceException。 嘗試取消裝箱對不兼容值類型的引用會導致 InvalidCastException。
相對於簡單的賦值而言,裝箱和取消裝箱過程需要進行大量的計算。 對值類型進行裝箱時,必須分配並構造一個新對象。 取消裝箱所需的強制轉換也需要進行大量的計算,只是程度較輕。
參考自: