1. 程式人生 > >C#中的"裝箱"(boxing)與"拆箱"(unboxing)

C#中的"裝箱"(boxing)與"拆箱"(unboxing)

/* 作者:耿奕廷    版權所有,轉載時請註明出處及作者    */

我們知道在C#中,所有的型別都派生自類object,而派生類和繼承類之間可以互相轉換,這就有了“裝箱”與“拆箱”的概念。

裝箱:是指把某一型別的值顯式或隱式的轉換成object類型,或轉成被此型別繼承的介面。裝箱後,這個object類的值在記憶體中heap區,是原型別的一個拷貝。如:

   int i=2;
   string str="Hello";
   object objstr=str;      //隱式
   object objint=(object)i; //顯式

有意思的是被裝箱後可以用obj.ToString()來列印原值,如 Console.WriteLine(objstr.ToString())顯示的是Hello。

拆箱:是指把裝箱後的object型別顯式轉成原型別。這時可以用is運算子或GetType()來判斷object的原型別。如

int  n=(int)objint;

int s=(string)objstr;

if(objint is int) Console.WriteLine("Yeah!");

if(objstr.GetType().ToString()=="System.String") Console.WriteLine("OK");

拆箱注意:

1. 如拆箱後沒有轉成原型別,編譯時不會出錯,但執行會出錯。所以拆箱後轉換類   型 一定要正確。

2.用GetType().ToString()判斷時一定要使用型別全稱,如:System.String 而不要用String