C# 的型別系統建立在兩大基石之上:值類型 與 參考類型。理解它們的差異,是掌握 C# 記憶體管理與程式行為的關鍵。
| 值類型 | 參考類型 |
|---|---|
| 簡單類型 | 類別 |
| 列舉 | 介面 |
| 結構 | 委派 |
| 陣列 |
值類型 直接儲存資料內容;參考類型 則儲存指向物件的參考(記憶體位址)。
想像你在某地買了一棟豪華別墅(物件),但從未親自去過,只手握一張地址(參考)。當你想使用別墅時,將地址交給計程車司機(編譯器/執行環境),司機依照地址找到別墅。你手中的地址就是變數名稱,別墅本身是記憶體中的實際物件。
using System;
class CValue {
public int Value = 0;
}
class Test {
static void Main() {
// 值類型行為
int val1 = 0;
int val2 = val1; // 複製值
val2 = 123; // 修改 val2 不影響 val1
// 參考類型行為
CValue ref1 = new CValue();
CValue ref2 = ref1; // 複製參考,指向同一物件
ref2.Value = 123; // 修改 ref2 影響 ref1
Console.WriteLine("Values: {0}, {1}", val1, val2); // 輸出: 0, 123
Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value); // 輸出: 123, 123
}
}
val1 與 val2 擁有獨立儲存空間,互不影響。ref2 複製的是 ref1 的參考,兩者指向同一物件實例。透過任一變數修改物件屬性,另一變數讀取時都會看到變化。參考類型的變數只是儲存物件位置的「地址」,而非物件本身。就像別墅被燒毀(物件內容改變),但地址(變數值)並未改變。這也解釋了為什麼在方法傳遞參考類型時,方法內部對物件的修改會影響外部原始物件。