許多開發者認為「值類型」等同於 int、bool 等數值類型。實則不然——值類型的本質是「繼承自 System.ValueType 的類型」。
System.Object。System.ValueType 繼承 System.Object,並覆寫 Equals()、GetHashCode() 等方法提供值語意。System.ValueType,不可再繼承其他類別(但可實作介面)。int、double、bool 等關鍵字,分別是 System.Int32、System.Double、System.Boolean 等結構體的別名。public struct CustomerStruct {
public string Name { get; set; }
}
編譯後 IL 顯示:
.class public sequential ansi sealed beforefieldinit CustomerStruct
extends [mscorlib]System.ValueType
| 操作 | 值類型 | 參考類型 |
|---|---|---|
| 記憶體配置 | 堆疊(或內嵌於物件內部) | 受控堆積 |
| 變數賦值 | 複製實例資料(副本) | 複製參考(指標) |
| 傳遞給方法 | 預設傳值(可用 ref/out 改傳址) | 傳參考 |
| 裝箱 | 堆疊→堆積,建立物件包裝器 | 無需裝箱 |
| 拆箱 | 堆積→堆疊,提取資料副本 | 不適用 |
object o = new object();
int aaa = 100;
o = aaa; // 發生裝箱:CLR 在堆積配置新物件,複製 aaa 的值 100 進去
CLR 偵測到 aaa 為 ValueType 衍生類型,自動在堆積配置記憶體並複製數值——這一切對開發者透明,但會影響效能。
System.ValueType 者皆為值類型,包含所有 struct、enum、基本型別。理解值類型本質,有助於避免不必要的裝箱拆箱、正確選擇 struct vs class、優化高效能場景的記憶體佈局。