裝箱
(boxing)
和拆箱(unboxing)是c#
型別系統中重要的概念。它通過允許任何數值型別的資料被轉換為任何形式型別的物件提供了數值型別和引用型別間的緊密聯絡。裝箱和拆箱使得對在其中任何型別都可以最終被看作物件的型別系統的統一的觀察變為可能。
裝箱轉換允許任何數值型別可以隱式地轉換為
object
型別或任何由數值型別實現的介面型別。裝箱乙個數值型別的資料報括對物件例項的定位和把數值型別資料拷貝到那個例項中。
裝箱數值型別的資料的實際過程,可以通過想像乙個對那種型別的裝箱類的實際例子來解釋。對於數值型別
t,裝箱類要按下面定義:
class t_box}
對於型別
t的數值
v的裝箱現在由執行表示式
t_box(v)
來代替,
並且返回型別為
object
的結果例項。這樣,語句
int i = 123;
object box = i;
從概念上符合
int i = 123;
object box = new int_box(i);
如上面的
t_box
和int_box
的裝箱型別實際不存在,而被裝箱資料的動態型別實際上並不是乙個類型別。作為替代,型別
t的乙個被裝箱的資料有動態型別
t,而使用
is操作符的動態型別檢查可以很方便地引用
t。例如,
int i = 123;
object box = i;
if (box is int)
將在控制台輸出字串
「box contains an int」。
裝箱轉換隱式地把被裝箱的資料進行了備份。這與從引用型別到
object
型別的轉換不同,在那裡資料一直引用相同的例項,並被認為幾乎不從型別
object
派生。例如,給出宣告
struct point}
下面的語句
point p = new point(10, 10);
object box = p;
p.x = 20;
console.write(((point)box).x);
因為在發生把
p賦值給
box的隱含裝箱操作時,
p被拷貝,所以將在控制台上輸出數值
10。如果
point
被宣告為乙個類,因為p和
box將引用相同的例項,就會輸出20。
1.1.2拆箱轉換
拆箱轉換允許任何
object
型別或從任何由數值型別實現的介面型別,可以顯式地轉換為任何數值型別。乙個拆箱操作由幾部分動作組成,首先檢查
object
例項是乙個所給數值型別的被裝箱資料,然後把數值從例項中拷貝出來。
參考前面章節描述的假象的裝箱型別,從物件
box到數值型別
t的拆箱轉換包括執行表示式
((t_box)box).value
。這樣,語句
object box = 123;
int i = (int)box;
從概念上符合
object box = new int_box(123);
int i = ((int_box)box).value;
對於為了在執行時提供數值型別的拆箱轉換,源變數資料必須是乙個指向乙個早先對那個數值型別資料打包建立的物件。如果源變數是
null
或引用乙個不相關的物件,就會丟擲乙個
invalidcastexception
錯誤。
裝箱和拆箱,自動裝箱和自動拆箱
以integer的建立為例。裝箱 把基本資料型別轉換成包裝類物件 int integer integer num1 new integer 17 拆箱 把乙個包裝類的物件,轉換成基本型別的變數 integer int int num2 num1.intvalue 自動裝箱 integer num3 ...
裝箱和拆箱
在c 中的有兩種型別的變數 值型別和引用型別。當值型別和引用型別相互轉化時,會發生裝箱和拆箱的過程。這裡有一點要宣告 經過拆箱或裝箱的物件會多出它自己乙份拷貝,如圖所示 從圖可以看出它和它的拷貝不在乙個儲存區域。這也是值型別和引用型別的區別所在。值型別總是在棧中,而引用型別總是在託管堆中。目前j2s...
裝箱和拆箱
net中的資料分為引用型別和值型別。引用型別繼承自system.object,值型別繼承自system.valuetype.我們自己定義的類和.net framework提供的類,都是屬於引用型別。一般的簡單型別如int,string和結構體等等都是屬於值型別。引用型別和值型別在記憶體中所佔的位置也...