C 裝箱和拆箱

2022-03-18 01:25:06 字數 1367 閱讀 3073

在裝箱拆箱之前簡單說一下值型別、引用型別:

值型別:原型別(sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、bool、decimal)、列舉(enum)、結構(struct)等,是在棧中分配記憶體,在申明的同時就初始化,以確保資料不為null;

引用型別:類、陣列、介面、委託、字串等,在堆中分配記憶體,初始化為null,引用型是需要garbage collection來**記憶體的,值型不用,超出了作用範圍,系統就會自動釋放;

裝箱:將值型別轉換為引用型別,用於在垃圾**堆中儲存值型別,是值型別到 object 型別或到此值型別所實現的任何介面型別的隱式轉換;

拆箱:將引用型別轉換為值型別,從 object 型別到值型別或從介面型別到實現該介面的值型別的顯式轉換;

利用裝箱和拆箱功能,可通過允許值型別的任何值與object型別的值相互轉換,將值型別與引用型別鏈結起來

簡例:int val = 100; 

object obj = val; 

console.writeline (「物件的值 = ", obj); 

這是乙個裝箱的過程,是將值型別轉換為引用型別的過程

int val = 100; 

object obj = val; 

int num = (int) obj; 

console.writeline ("num: ", num); 

這是乙個拆箱的過程,是將值型別轉換為引用型別,再由引用型別轉換為值型別的過程

1、  呼叫乙個含型別為object的引數的方法,該object可支援任意為型,當你需要將乙個值型別(如int32)傳入時,則需要裝箱;

2、  乙個非泛型的容器,同樣是為了保證通用,而將元素型別定義為object。若要將值型別資料加入容器時,則需要裝箱;

裝箱:1、  首先從託管堆中為新生成的引用物件分配記憶體;

2、  然後將值型別的資料拷貝到剛剛分配的記憶體中;

3、  返回託管堆中新分配物件的位址;

進行一次裝箱要進行分配記憶體和拷貝資料這兩項比較影響效能的操作。

拆箱:1、  首先獲取託管堆中屬於值型別那部分欄位的位址,這一步是嚴格意義上的拆箱;

2、  將引用物件中的值拷貝到位於執行緒堆疊上的值型別例項中;

嚴格意義上的拆箱,並不影響效能,但伴隨這之後的拷貝資料的操作就會同boxing操作中一樣影響效能。

理論上,裝箱時,生成的是全新的引用物件,這會有時間損耗,也就是造成效率降低。通過過載函式,也可以通過泛型來避免裝箱。

對於裝箱拆箱**的優化,由於c#中對裝箱和拆箱都是隱式的,所以,根本的方法是對**進行分析,而分析最直接的方式是了解原理結何檢視反編譯的il**。比如:在迴圈體中可能存在多餘的裝箱,你可以簡單採用提前裝箱方式進行優化。

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 返回物件位址,即...