裝箱 是 C# 類型系統中連結實值類型與引用類型的關鍵機制。它指將一個實值類型(如 int、struct、enum)隱含或顯式轉換為 object 類型,或該實值類型實作的介面類型。過程中,執行期會在 Managed Heap 上配置一個新的物件實例,並將實值類型的資料複製進去。
int i = 10;
object obj = i; // 編譯器自動產生 box 指令
int i = 10;
object obj = (object)i; // 明確標示意圖,語意更清晰
我們可以想像編譯器為每個實值類型 T 產生一個對應的參考類型包裝器:
class T_Box {
T value;
public T_Box(T t) { value = t; }
}
當執行 object obj = i; 時,實際相當於 object obj = new Int32_Box(i);。這解釋了為什麼裝箱後的物件與原始變數互不干擾:
using System;
class Test {
public static void Main() {
int i = 10;
object obj = i; // 裝箱
if (obj is int) {
Console.WriteLine("i 已被裝箱!");
}
i = 20; // 修改原始值
Console.WriteLine($"int: i = {i}"); // 輸出 20
Console.WriteLine($"object: obj = {obj}"); // 輸出 10
}
}
輸出結果證明:obj 保存的是裝箱當時的值 10,後續對 i 的修改不會影響已裝箱的物件。這正是「值語意」在參考類型容器中的體現。
