裝箱和取消裝箱詳解

裝箱:

裝箱用於在託管內存中存儲值類型。 裝箱是值類型到 object 類型或到此值類型所實現的任何接口類型的隱式轉換 對值類型裝箱會在堆中分配一個對象實例,並將該值複製到新的對象中。

如: int i = 123; object o = i;

此語句的結果是在堆棧上創建對象引用 o,而在堆上則引用 int 類型的值。 該值是賦給變量 i 的值類型值的一個副本 

下圖說明了兩個變量 i 和 o 之間的差異。

BoxingConversion 圖

也可以進行顯式裝箱,但顯式裝箱不是必需的:

如:i = 123; object o = (object)i;

取消裝箱

取消裝箱是從 object 類型到值類型或從接口類型到實現該接口的值類型的顯式轉換

 取消裝箱操作包括:

1.檢查對象實例,以確保它是給定值類型的裝箱值。

2.將該值從實例複製到值類型變量中。

如:i = 123; object o = i;  int j = (int)o;

下圖演示上述語句的結果。

圖:取消裝箱轉換

取消裝箱轉換

注意:

要在運行時成功取消裝箱值類型,被取消裝箱的項必須是對一個對象的引用,該對象是先前通過裝箱該值類型的實例創建的。 嘗試取消裝箱 null 會導致 NullReferenceException 嘗試取消裝箱對不兼容值類型的引用會導致 InvalidCastException

性能問題:

相對於簡單的賦值而言,裝箱和取消裝箱過程需要進行大量的計算。 對值類型進行裝箱時,必須分配並構造一個新對象。 取消裝箱所需的強制轉換也需要進行大量的計算,只是程度較輕。

參考自:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章