C#中的"裝箱"(boxing)與"拆箱"(unboxing)
阿新 • • 發佈:2018-12-29
/* 作者:耿奕廷 版權所有,轉載時請註明出處及作者 */
我們知道在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