裝箱 就是把「值類型」轉換成「引用類型」; 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拆箱!!