裝箱和拆箱

2021-04-13 02:42:04 字數 1627 閱讀 9095

在c#中的有兩種型別的變數:值型別和引用型別。當值型別和引用型別相互轉化時,會發生裝箱和拆箱的過程。這裡有一點要宣告:經過拆箱或裝箱的物件會多出它自己乙份拷貝,如圖所示:

從圖可以看出它和它的拷貝不在乙個儲存區域。這也是值型別和引用型別的區別所在。值型別總是在棧中,而引用型別總是在託管堆中。(目前j2se5.0也支援了裝箱和拆箱,但是我目前不知道是否和c#一樣)。為了進一步理解看下面例子:

struct point

static void main()

輸出結果為:

p2.x:=10;p2.y=20;

p2.x:=10;p2.y=20;

p.x:=16;p.y=34;

可知,變數經過拆箱/裝箱後,得到是自己的另乙份拷貝。

裝箱是指將值型別轉換為引用型別的過程,拆箱是指將引用型別轉換為值型別的過程。在裝箱時採用隱式轉換,在拆箱是時採用顯示轉換。即當派生類轉換為基類時(縮小)採用隱式轉換,當基類轉換為派生類時(擴大)採用顯式轉換。

using system;

using system.collections.generic;

using system.text;

}

}

裝箱和拆箱:任何值型別、引用型別可以和object(物件)型別之間進行轉換。裝箱轉換是指將乙個值型別隱式或顯式地轉換成乙個object型別,或者把這個值型別轉換成乙個被該值型別應用的介面型別(inte***ce-type)。把乙個值型別的值裝箱,就是建立乙個object例項並將這個值複製給這個object,裝箱後的object物件中的資料位於堆中,堆中的位址在棧中。被裝箱的型別的值是作為乙個拷貝賦給物件的。如:

int i = 10;

object obj = i; //隱式裝箱

object obj = object(i); //顯式裝箱

if(obj is int) //int

console.writeline(「ok」);

console.writeline(obj.gettype()); //system.int32

有兩種方式來檢視包裝以後的引用物件中包裝的原始資料的型別。要判斷原始型別是否是某個給定的原子型別,用is;如果要返回乙個字串,可以用object類的gettype方法。

拆箱轉換是指將乙個物件型別顯式地轉換成乙個值型別,或是將乙個介面型別顯式地轉換成乙個執行該介面地值型別。注意裝箱操作可以隱式進行但拆箱操作必須是顯式的。拆箱過程分成兩步:首先,檢查這個物件例項,看它是否為給定的值型別的裝箱值。然後,把這個例項的值拷貝給值型別的變數。比如:

int i = 10;

object obj = i;

int j = (int)obj;

有兩種方式來檢視包裝以後的引用物件中包裝的原始資料的型別。要判斷原始型別是否是某個給定的原子型別,用is;如果要返回乙個字串,可以用object類的gettype方法。

拆箱轉換是指將乙個物件型別顯式地轉換成乙個值型別,或是將乙個介面型別顯式地轉換成乙個執行該介面地值型別。注意裝箱操作可以隱式進行但拆箱操作必須是顯式的。拆箱過程分成兩步:首先,檢查這個物件例項,看它是否為給定的值型別的裝箱值。然後,把這個例項的值拷貝給值型別的變數。比如:

int i = 10;

object obj = i;

int j = (int)obj;

裝箱和拆箱,自動裝箱和自動拆箱

以integer的建立為例。裝箱 把基本資料型別轉換成包裝類物件 int integer integer num1 new integer 17 拆箱 把乙個包裝類的物件,轉換成基本型別的變數 integer int int num2 num1.intvalue 自動裝箱 integer num3 ...

裝箱和拆箱

裝箱 boxing 和拆箱 unboxing 是c 型別系統中重要的概念。它通過允許任何數值型別的資料被轉換為任何形式型別的物件提供了數值型別和引用型別間的緊密聯絡。裝箱和拆箱使得對在其中任何型別都可以最終被看作物件的型別系統的統一的觀察變為可能。裝箱轉換允許任何數值型別可以隱式地轉換為 objec...

裝箱和拆箱

net中的資料分為引用型別和值型別。引用型別繼承自system.object,值型別繼承自system.valuetype.我們自己定義的類和.net framework提供的類,都是屬於引用型別。一般的簡單型別如int,string和結構體等等都是屬於值型別。引用型別和值型別在記憶體中所佔的位置也...