**出處;
裝箱是將值型別轉換為object
型別或由此值型別實現的任何介面型別的過程。 當 clr 對值型別進行裝箱時,會將該值包裝到 system.object 內部,再將後者儲存在託管堆上。 取消裝箱將從物件中提取值型別。 裝箱是隱式的;取消裝箱是顯式的。 裝箱和取消裝箱的概念是型別系統 c# 統一檢視的基礎,其中任一型別的值都被視為乙個物件。
下例將整型變數i
進行了裝箱並分配給物件o
。
int i = 123;//相對於簡單的賦值而言,裝箱和取消裝箱過程需要進行大量的計算。 對值型別進行裝箱時,必須分配並構造乙個新物件。 取消裝箱所需的強制轉換也需要進行大量的計算,只是程度較輕。 有關更多資訊,請參閱效能。the following line boxes i.
object o = i;
裝箱用於在垃圾**堆中儲存值型別。 裝箱是值型別到object
型別或到此值型別所實現的任何介面型別的隱式轉換。 對值型別裝箱會在堆中分配乙個物件例項,並將該值複製到新的物件中。
請看以下值型別變數的宣告:
int i = 123;以下語句對變數
i
隱式應用了裝箱操作:
//此語句的結果是在堆疊上建立物件引用boxing copies the value of i into object o.
object o = i;
o
,而在堆上則引用int
型別的值。 該值是賦給變數i
的值型別值的乙個副本。 下圖說明了兩個變數i
和o
之間的差異。
裝箱轉換
還可以像下面的示例一樣執行顯式裝箱,但顯式裝箱從來不是必需的:
int i = 123此示例使用裝箱將整型變數;object o = (object)i; //
explicit boxing
i
轉換為物件o
。 這樣一來,儲存在變數i
中的值就從123
更改為456
。 該示例表明原始值型別和裝箱的物件使用不同的記憶體位置,因此能夠儲存不同的值。
class取消裝箱是從testboxing
", i);
system.console.writeline(
"the object-type value =
", o);
}}/*
output:
the value-type value = 456
the object-type value = 123
*/
object
型別到值型別或從介面型別到實現該介面的值型別的顯式轉換。 取消裝箱操作包括:
下面的語句演示裝箱和取消裝箱兩種操作:
c# 複製
下圖演示上述語句的結果。int i = 123; // a value type
object o = i; // boxing
int j = (int)o; // unboxing
取消裝箱轉換
要在執行時成功取消裝箱值型別,被取消裝箱的項必須是對乙個物件的引用,該物件是先前通過裝箱該值型別的例項建立的。 嘗試取消裝箱null
會導致 nullreferenceexception。 嘗試取消裝箱對不相容值型別的引用會導致 invalidcastexception。
下面的示例演示無效的取消裝箱及引發的invalidcastexception
。 使用try
和catch
,在發生錯誤時顯示錯誤資訊。
class此程式輸出:testunboxing
catch
(system.invalidcastexception e)
error: incorrect unboxing.
", e.message);}}
}
specified cast is not valid. error: incorrect unboxing.
如果將下列語句:
複製
int j = (short) o;
更改為:
複製
int j = (int) o;
將執行轉換,並將得到以下輸出:
unboxing ok.
c 基礎 裝箱與拆箱
1.定義 裝箱 值型別轉換為引用型別。拆箱 引用型別轉換為值型別。關於值型別和引用型別,之前用了一篇文章來做了淺顯的討論 傻傻分不清楚 c 值型別 引用型別 2.細節討論 2.1裝箱 例子 object ojb 1 上面一行 是很簡單的裝箱,1是int型別,是值型別,隱式轉換為object引用型別。...
C 裝箱與拆箱
要掌握裝箱與拆箱,就必須了解cts及它的特點。net重要技術和基礎之一的cts common type system 顧名思義,cts就是為了實現在應用程式宣告和使用這些型別時必須遵循的規則而存在的通用型別系統。net將整個系統的型別分成兩大類 value type 和 reference type...
C 裝箱與拆箱
裝箱是將 值型別轉換為 引用型別 拆箱是將 引用型別 轉換為值型別 利用裝箱和拆箱功能,可通過允許 值型別的任何值與 object 型別 的值相互轉換,將值型別與引用型別鏈結起來 例如 int val 100 object obj val console.writeline 物件的值 obj 這是乙...