| 特性 | 值型別 | 引用型別 |
|---|---|---|
| 範例 | int、float、bool、struct (DateTime) | string、array、class 定義的型別 |
| 記憶體配置 | 堆疊 | 堆積 |
| 存取效率 | 高(無位址轉換) | 低(需位址轉換) |
| 記憶體回收 | 用畢立即回收 | 等待 GC 回收 |
| 指派操作 | 複製,建立新物件 | 複製參考,不建立新物件 |
| 參數/傳回值 | 物件複製 | 原物件參考 |
| 型別擴充性 | 難擴充 | 易擴充 |
// 錯誤:無法修改呼叫端變數
public void Increment(int i) { i++; }
// 正確:使用 ref 關鍵字
public void Increment(ref int i) { i++; }
值型別預設為值傳遞(複製),需明確標記 ref 或 out 才能修改原變數。
public void AddValue(MyType typValue)
{
typValue.Count = typValue.Count + 15; // 修改了原物件!
}
引用型別傳遞的是參考,函式內修改屬性會影響原物件。若不想修改原物件,需手動建立副本或設計為不可變型別。
理解值/引用型別在記憶體配置、指派語意、參數傳遞上的根本差異,能避免細微但關鍵的邏輯錯誤。