我們都知道,c#中的每一種型別要麼是值型別,要麼是引用型別。所以每個物件要麼是值型別的例項,要麼是引用型別的例項。
值型別和引用型別之間的轉換稱為裝箱和拆箱。
裝箱:值型別轉換為引用型別。
拆箱:引用型別轉換為值型別。
在詳細介紹裝箱和拆箱之前,先總結一下什麼是值型別和引用型別?
值型別和引用型別都繼承system.object,引用型別直接從system.object繼承,而值型別則繼承其子類,即直接繼承system.valuetype。
陣列:(派生於system.array)陣列的元素,不管是引用型別還是值型別,都儲存在託管堆上;
類:class(派生於system.object);
介面:inte***ce(介面不是乙個「東西」,所以不存在派生於何處的問題。);
委託:delegate(派生於system.delegate);
object:(system.object的別名);
字串:string(system.string的別名)。
int val = 100;
object obj = val;
console.writeline (「物件的值 = ", obj);
這是乙個裝箱的過程。
詳細步驟(box)
1、在堆上分配乙個記憶體空間,大小等於需要裝箱的值型別物件的大小加上兩個引用型別物件都擁有的成員:型別物件指標和同步塊引用。
2、把堆疊上的值型別物件複製到堆上新分配的物件。
3、返回乙個指向堆上新物件的引用,並且儲存到堆疊上被裝箱的那個值型別的物件裡。
注:這個步驟不需要我們自己編寫,任何裝箱的地方,編譯器會自動加上執行以上功能的il**。
int val = 100;
object obj = val;
int num = (int) obj;
console.writeline ("num: ", num);
這是拆箱的過程,將值型別轉換成引用型別,再由引用型別轉換成值型別的過程。
注:被裝過箱的物件才能被拆箱。
詳細步驟(unbox)
1、獲取已裝箱的物件的位址
2、將值從堆上的物件中複製到堆疊上的值變數中
每次裝箱需要在堆中new乙個新的物件,當量特別大時會影響程式的效率,拆箱過程對效能損耗較小。
c 裝箱和拆箱
c 裝箱和拆箱 概念 裝箱 將值型別轉換為引用型別的過程叫做裝箱 值型別 引用型別 相反,拆箱 將引用型別轉換為值型別 叫做拆箱 引用型別 值型別 裝箱例子 int i 2008 object obj i console.writeline 1 i的值為,裝箱之後的值 i,obj i 927 con...
C 裝箱和拆箱
1 什麼是裝箱和拆箱 裝箱是將值型別轉換為引用型別 拆箱是將引用型別轉換為值型別 2 什麼時候需要裝箱?值型別是高效輕量的型別,因為預設情況下在堆上不包括他們的物件元件,然而,如果我們需要物件元件,這個時候就需要裝箱了。最常見的場景就是 乙個方法你希望能共用,設定的引數型別是object型別 引用型...
C 裝箱和拆箱
值型別例項進行裝箱時的步驟 1 在託管堆中分配記憶體。需要注意的是,由於是將值型別進行引用型別化,因而分配的記憶體空間除了值型別各個欄位所需的記憶體之外,還要加上託管堆所有物件都有的兩個額外成員 型別物件指標和同步塊索引 所需的記憶體。2 將值型別的字段複製到新分配的堆記憶體中。3 返回物件位址,即...