.NET 型別系統分為兩大類:
int, double, char)、enum、struct。class、interface、delegate、array、string。StringBuilder first = new StringBuilder();
StringBuilder second = first; // 兩變數指向同一物件
first.Append("hello");
first = null; // first 不再參考物件,但物件仍存在
Console.WriteLine(second); // 輸出 "hello"
second 仍參考原物件,故可輸出修改後內容。將參考設為 null 僅切斷變數與物件連結,不影響其他參考同一物件的變數。
struct IntHolder { public int i; }
IntHolder first = new IntHolder(); first.i = 5;
IntHolder second = first; // 實值複製
first.i = 6;
Console.WriteLine(second.i); // 輸出 5
second 獲得 first 的資料複本,後續修改 first 不影響 second。
string 是參考型別,但行為類似實值型別:
string s1 = "hello";
string s2 = s1;
s1 = "world"; // s1 指向新字串物件,s2 仍為 "hello"
任何「修改」字串的操作 (Replace, Substring 等) 實際上都會建立新字串物件,原物件不變。
| 型別分類 | 預設傳遞方式 | 效果 |
|---|---|---|
| 實值型別 | 傳值 | 方法內修改不影響呼叫端變數 |
| 參考型別 | 傳參考 (參考本身傳值) | 方法內修改物件內容影響呼叫端;重新指派參數不影響呼叫端變數 |
ref:呼叫端變數必須初始化,方法可替換整個變數 (實值型別換值、參考型別換參考)。out:呼叫端變數無需初始化,方法必須指派值,語意為「輸出參數」。in (C# 7.2+):唯讀傳參考,避免大型結構複製開銷,防止意外修改。理解「變數儲存的是資料還是參考」是掌握 C# 參數傳遞的關鍵。實值型別複製資料,參考型別複製參考;ref/out/in 則控制「參考本身」是否可被替換。