C# 方法參數預設為傳值(值型別複製內容,參考型別複製參考)。若需在方法內修改引數本身,需使用 ref、out 或 params。
public static void RefTest(ref int val)
{
val += 2;
}
static void Main()
{
int i = 3; // 必須初始化
RefTest(ref i);
Console.WriteLine(i); // 輸出 5
}
public static int TestOut(out int a, out int b)
{
a = 10;
b = 20;
return 0;
}
static void Main()
{
int i, j; // 無需初始化
Console.WriteLine(TestOut(out i, out j)); // 0
Console.WriteLine(i); // 10
Console.WriteLine(j); // 20
}
static void F(params int[] args)
{
Console.WriteLine($"參數個數: {args.Length}");
for (int i = 0; i < args.Length; i++)
Console.WriteLine($"\targs[{i}] = {args[i]}");
}
static void Main()
{
F(); // 0 個
F(1); // 1 個
F(1, 2); // 2 個
F(1, 2, 3); // 3 個
F(new int[] {1,2,3,4}); // 陣列
}
輸出:
參數個數: 0
參數個數: 1
args[0] = 1
參數個數: 2
args[0] = 1
args[1] = 2
參數個數: 3
args[0] = 1
args[1] = 2
args[2] = 3
參數個數: 4
args[0] = 1
args[1] = 2
args[2] = 3
args[3] = 4
| 關鍵字 | 方向 | 呼叫端初始化 | 方法內賦值要求 | 典型用途 |
|---|---|---|---|---|
| 無 (傳值) | 單向輸入 | 必要 | 不影響呼叫端 | 一般輸入參數 |
| ref | 雙向 | 必要 | 可讀可寫 | 交換值、修改結構體 |
| out | 單向輸出 | 不必要 | 所有路徑必須賦值 | 多返回值、TryParse 模式 |
| params | 單向輸入 | 不必要 | 視為陣列 | 可變參數列表 |
in (C# 7.2+):唯讀 ref,防止方法內意外修改大型結構體,避免防禦性複製。ref struct (C# 7.2+):限定只能在堆疊分配,配合 Span<T> 實現高效能切片。ref/out 參數(可用 ValueTuple 或自訂型別替代)。