深入理解值類型與參考類型的記憶體行為是精通 .NET 的基石。本文從區域變數宣告、指派操作、複雜巢狀結構三個維度,配合記憶體圖示,徹底釐清「值類型在堆疊、參考類型在堆積」的迷思與真相。
private static void Main()
{
int i; // 值類型
MyClass mc; // 參考類型
i = 5;
mc = new MyClass();
}
5。![堆疊框圖:i → [5]](https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017010417263225.jpg)
null (零位址)。new MyClass() 在**堆積**配置物件實例,將起始位址存入堆疊變數。
int i = 5;
int j = i; // 複製 5 到 j
j = 10; // i 仍為 5,互不影響
![i=[5], j=[5] 獨立儲存](https://code.yunyiwangluo.com/bianchen/UploadFiles_4619/201701/2017010417263200.jpg)
結構體同理,struct 指派為**逐欄位複製** (Shallow Copy)。
MyClass x = new MyClass();
MyClass y = x; // 複製指標,x 與 y 指向同一堆積物件

任一變數修改物件狀態,另一變數讀取皆見新值。這是**別名**關係,非複製物件。
struct MyStruct
{
public int i; // 值類型:內嵌儲存
public Exception ex; // 參考類型:儲存指標,實例在堆積
}

結構體本身是值類型,但其參考類型欄位仍指向堆積。
class MyClass
{
public MyStruct ms; // 值類型:內嵌於 MyClass 物件內部 (堆積)
public Random r; // 參考類型:指標指向另一堆積物件
}

**鐵律**:參考類型實例永遠在堆積;值類型實例「跟著走」 — 作為區域變數在堆疊,作為類別欄位內嵌在堆積,作為結構體欄位內嵌在結構體內。
錯誤說法:「值類型在堆疊,參考類型在堆積」。
正確說法:「值類型變數的值儲存在變數本身;參考類型變數的值儲存在堆積,變數本身儲存指向堆積值的參考。」
掌握這些核心機制,能避免常見 Bug (如結構體修改失效、預期獨立卻共享狀態)、優化效能 (減少裝箱/解箱、理解傳值/傳參成本)、正確實作 IDisposable 與最終化邏輯。