從內存執行的角度來看,值類型的內存分配在線程的堆棧上,而引用類型的內存分配在託管堆上。所以從值類型向引用類型的轉換,勢必牽涉到數據的拷貝與指針引用等操做。c#
裝箱操做,大體過程爲:在託管堆中分配新對象的內存,將值類型的字段拷貝到該內存中,而後返回該對象的地址,這樣就完成了從值類型到引用類型的轉變;拆箱操做,則是獲取已裝箱對象中來自值類型部分字段的地址。裝箱與拆箱並不是徹底對稱的互逆操做,拆箱並不包含字段的拷貝。數據結構
概念雷區:性能
值類型,提供了輕量型的數據結構,具備較少的內存開銷,對系統性能有明顯的做用。而缺點是:缺省方法表指針,由於沒法在指望System.Object或其繼承類的方法上調用值類型。spa
裝箱過程解析線程
拆箱過程解析指針
1 public static void Main() 2 { 3 int i = 100; 4 //裝箱 5 i.GetType(); 6 //未裝箱 7 i.ToString(); 8 //顯式裝箱 9 object o = i; 10 Hashtable ht = new Hashtable(); 11 ht.Add("One", o); 12 ht.Add("Two", o); 13 }
GetType方法由System.Object類型提供,所以值類型調用時必須執行裝箱操做;而ToString方法則由int類型覆蓋,所以不會裝箱。Hashtable的Add方法接受System.Object類型的參數,所以經過顯式的類型轉換來減小隱式的裝箱操做。code