ref 傳遞參數位址,out 用於回傳值,兩者皆允許方法修改引數值,但有關鍵差異:
| 特性 | ref | out |
|---|---|---|
| 呼叫前必須指派初值 | 是 | 否 |
| 方法內是否清空變數 | 否 | 是 (視為未指派) |
| 方法返回前必須指派 | 否 (可不修改) | 是 (所有 out 參數) |
static void outTest(out int x, out int y)
{
// 離開前必須指派 x, y
x = 1; y = 2;
}
static void refTest(ref int x, ref int y)
{
x = 1; y = x; // 可讀取原值
}
public static void Main()
{
int a, b;
outTest(out a, out b); // OK: a,b 未指派也可
Console.WriteLine($"a={a};b={b}");
int c = 11, d = 22;
outTest(out c, out d); // 原值會被清空重新指派
Console.WriteLine($"c={c};d={d}");
int o = 11, p = 22;
refTest(ref o, ref p); // 必須先指派
Console.WriteLine($"o={o};p={p}");
}
關鍵點:out 適合多重回傳值場景,ref 適用於需讀取並修改原值的情況。