.net中的資料分為引用型別和值型別。
引用型別繼承自system.object,值型別繼承自system.valuetype.
我們自己定義的類和.net framework提供的類,都是屬於引用型別。一般的簡單型別如int,string和結構體等等都是屬於值型別。
引用型別和值型別在記憶體中所佔的位置也是不同的,引用型別分配於託管堆上,而值型別分配於當前執行緒的堆疊空間上。
裝箱的過程就是將值型別變為引用型別的過程。整個過程大體是:申請託管堆空間--複製值型別的變數值到託管堆空間中--在當前執行緒堆疊空間分配乙個指標指向該託管堆空間。乙個值型別就通過這幾步被封裝為乙個引用型別了。
拆箱的過程與之基本相反。即把引用型別的值從託管堆複製出新申請的堆疊空間單元中,刪除指向託管堆的指標。
什麼情況下發生裝箱和拆箱呢?
例如,.net中所有類的最上層基類都是system.object,system.valuetype也不例外,system.object中有很多公共的方法,如tostring(),equal()等,繼承自system.valuetype的值型別在呼叫這些方法時,就必須要經歷乙個裝箱的過程,如:
int ntype=2;
console.writeline(ntype.tostring()); // "2"
乙個拆箱的例子:
int ntype = 2;
object objtemp = (object)ntype; // 裝箱
int ncopytype = (int)objtemp; // 拆箱
裝箱拆箱過程所帶來的執行效率的降低可想而知。
在編寫**過程中應盡量避免裝箱拆箱的操作。
裝箱和拆箱,自動裝箱和自動拆箱
以integer的建立為例。裝箱 把基本資料型別轉換成包裝類物件 int integer integer num1 new integer 17 拆箱 把乙個包裝類的物件,轉換成基本型別的變數 integer int int num2 num1.intvalue 自動裝箱 integer num3 ...
裝箱和拆箱
在c 中的有兩種型別的變數 值型別和引用型別。當值型別和引用型別相互轉化時,會發生裝箱和拆箱的過程。這裡有一點要宣告 經過拆箱或裝箱的物件會多出它自己乙份拷貝,如圖所示 從圖可以看出它和它的拷貝不在乙個儲存區域。這也是值型別和引用型別的區別所在。值型別總是在棧中,而引用型別總是在託管堆中。目前j2s...
裝箱和拆箱
裝箱 boxing 和拆箱 unboxing 是c 型別系統中重要的概念。它通過允許任何數值型別的資料被轉換為任何形式型別的物件提供了數值型別和引用型別間的緊密聯絡。裝箱和拆箱使得對在其中任何型別都可以最終被看作物件的型別系統的統一的觀察變為可能。裝箱轉換允許任何數值型別可以隱式地轉換為 objec...