實值型別是資料容器,不具多型性。.NET 框架設計為單一繼承引用型別體系,System.Object 為根。兩者設計目的截然不同,.NET 用裝箱拆箱連接。裝箱:將實值型別放置於無型別引用物件(箱子),使實值型別在需要時可作引用型別使用。拆箱:從箱子額外複製一份實值型別資料。裝箱拆箱讓你在需 System.Object 的地方使用實值型別,但它們是效能強盜,有時產生暫時物件,導致隱藏 Bug。應盡可能避免。
裝箱將實值型別轉為引用型別:堆積建立新引用物件(箱子),實值型別資料在其中儲存一份副本。箱子包含實值型別副本,並複製實現的介面。從箱子取回內容時,建立實值型別副本並回傳。關鍵概念:副本存入箱子,每次存取箱子又建立新副本。

圖 2.3:實值型別資料在箱子中。轉為 System.Object 引用,建立無名引用類別,資料儲存其中,所有存取必須透過箱子。
裝箱拆箱常自動完成!任何需 System.Object 地方使用實值型別,編譯器產生裝箱拆箱語句。透過介面指標存取實值型別也會發生。裝箱無任何警告,即使最簡單語句:
Console.WriteLine("A few numbers:{0}, {1}, {2}", 25, 32, 50);
重載 Console.WriteLine 需 System.Object 陣列引用,整數為實值型別,必須裝箱後傳遞。WriteLine 內部透過調用箱子 ToString() 存取。結構如下:
int i = 25; object o = i; // box
Console.WriteLine(o.ToString());
// WriteLine 內部:
object o; int i = (int)o; // unbox
string output = i.ToString();