裝箱(boxing)和拆箱(unboxing) [轉]

1.  裝箱和拆箱

裝箱 就是把「值類型」轉換成「引用類型」; c#

拆箱 就是把「引用類型」轉換成「值類型」; 性能

首先,咱們要弄明白爲何須要裝箱和拆箱。C#的全部類型,包括int、boo等,都繼承自System.Object,可是卻又有值類型和引用類型之分。這時你要問,int是繼承自object類型的,object是引用類型,那爲什麼int不是引用類型而是值類型的呢?這就涉及到裝箱和拆箱的概念了。 spa

         咱們知道對象是建立在堆上的,它的建立和銷燬必然帶來額外的CPU和內存消耗。若是將int,boo等微小而經常使用的數據類型都放在堆上建立和銷燬,語言的性能將會被極大的限制,有時甚至是沒法忍受的。C#將值類型和引用類型分開,值類型直接在棧中被建立,超過做用域後直接銷燬。當須要值類型成爲對象時,使用裝箱操做,讓值類型變爲一個引用類型的對象。這樣,咱們就能夠使用object做爲通用的接口統一語言內的一切類型。 code

        拆箱 在MSDN官方文檔裏用的是 取消裝箱。事實上拆箱是裝箱的逆操做,也就是說咱們只對裝過箱的引用類型(一般是object對象)進行拆箱操做。單純拆箱操做的後果沒法設想的。 對象

        裝箱和拆箱是C#的核心概念,C#利用其完成類型系統的統一。有了裝箱,任何類型的值均可以視爲一個對象。CLR在裝箱時是將值類型包裝到System.Object的內部,再將其存儲到託管堆上。拆箱是從對象中提取值類型。裝箱是隱式的而拆箱是顯示的。 繼承

//裝箱 boxing
int i = 3 ;  //分配在棧上
object o = i ;//隱式裝箱操做,int i 在堆上
object b = (object)i ; //顯示裝箱操做
//拆箱 unboxing
int j = (int) o ;//顯示拆箱(將對象o拆箱爲int類型)
 
int k = b ;//error!!, 不能隱式拆箱

拆箱 的操做包括 接口

1,檢查對象實例,以卻確保它是給定值類型的裝箱值。 內存

2,將該值從實例複製到值類型變量中。 作用域

 下面來看看這個例子: 文檔

int i=0;
System.Object obj=i;
Console.WriteLine(i+","+(int)obj);


其中共發生了3次裝箱和一次拆箱!^_^,看出來了吧?!
第一次是將i裝箱,第2次是輸出的時候將i轉換成string類型,而string類型爲引用類型,即又是裝箱,第三次裝箱就是(int)obj的轉換成string類型,裝箱!
拆箱就是(int)obj,將obj拆箱!! 

相關文章
相關標籤/搜索