class 與 struct 語法幾乎相同,但待遇天差地別。本質上:class = 參考型別(堆積),struct = 值型別(堆疊)。此差異衍生出所有行為不同。本文為系列第四回第一部分。
System.Objectnew 回傳參考(位址),物件資料在受控堆積System.ValueType(繼承自 Object)| # | 特性 | class | struct |
|---|---|---|---|
| 1 | 型別分類 | 參考型別 | 值型別 |
| 2 | 基底類別 | System.Object | System.ValueType |
| 3 | 多型支援 | 完整支援 | 不支援(密封,無虛擬方法) |
| 4 | 繼承能力 | 可繼承類別/介面,可為基類 | 不可繼承類別/結構,不可為基類,可實作介面 |
| 5 | 建構函式 | 可定義無參/有參 | 僅能定義有參建構函式,無參由編譯器產生(歸零初始化) |
| 6 | 解構函式 | 可定義 | 不可定義 |
| 7 | 實例化 | 需 new | 可不需 new(宣告即初始化歸零) |
| 8 | 抽象/虛擬 | 可 abstract/virtual | 不可 abstract/virtual |
| 9 | 修飾符限制 | 可 protected/virtual/sealed/override | 不可上述修飾符,可覆寫 Object 三虛擬方法 (Equals/ToString/GetHashCode) |
| 10 | 複製語意 | 淺/深複製需手動實作 | 指派即值複製,簡單高效 |
| 11 | 記憶體回收 | GC 追蹤回收 | 離開作用域立即釋放(堆疊展開) |
| 12 | 參數傳遞 | 傳參考(傳址) | 傳值(複製副本) |
// class: 參考型別
MyClass a = new MyClass(); // a 在堆疊,指向堆積物件
MyClass b = a; // b 複製參考,指向同一物件
// struct: 值型別
MyStruct x = new MyStruct(); // x 在堆疊,直接包含資料
MyStruct y = x; // y 複製整個資料,獨立副本

面向對象編程核心是行為與多型。class 提供完整多型、繼承、封裝,符合 OOP 主流。struct 定位為資料容器(零件盒),class 為有行為的機器。
Struct[] 連續記憶體、CPU 快取友善、無 GC 壓力
需要多型/繼承/複雜行為? → 是 → class
否
↓
主要是資料容器、不可變、小於 16 bytes? → 是 → struct
否
↓
大量陣列分配、效能關鍵路徑? → 是 → struct (測試驗證)
否
↓
預設 → class
class 與 struct 最大差異在於記憶體配置位置(堆積 vs 堆疊),衍生出複製語意、繼承、多型、GC、參數傳遞等所有不同。理解記憶體模型,才能做正確選擇。下一篇將以經典範例與 .NET Framework 實作深度驗證。