裝箱與拆箱(又叫取消裝箱)就是值型別與參照型別的轉換,是值型別和參照型別之間的橋樑。
之所以可以這樣轉換是因為 CTS 允許這樣做。只有值型別才存在裝箱和拆箱。
裝箱是隱式的,拆箱是顯式的,因為你需要告訴 CLR 你要給拆出來的值賦予什麼型別。
通過深入了解裝箱與拆箱的過程,我們可以知道其中包含了對堆上記憶體的操作,故會消耗效能,這是完全不必要的。
另外值得注意的是,裝箱需要比原資料更多的空間,因為它需要兩個參照型別的標準設定:型別物件指標和同步塊索引。
裝箱的過程
裝箱就是把值型別轉換為 object 型別或由此值型別實現的任何介面型別,如下圖所示:
int i = 1;
object o = i;
具體過程:
-
在堆中申請記憶體,記憶體大小為值型別的大小,再加上額外固定空間(型別物件指標和同步塊索引)。
-
將值型別的欄位值拷貝到新分配的記憶體中。
-
返回新參照物件的記憶體地址(給棧上的參照)。