C# 方法參數分為四種模式,理解其語意差異對寫出正確、高效的程式碼至關重要。本文逐一解析並附實戰範例。
| 類型 | 修飾詞 | 傳遞機制 | 初始化要求 | 典型用途 |
|---|---|---|---|---|
| 值參數 | (無) | 複製值,方法內修改不影響原變數 | 呼叫前必須已初始化 | 單向輸入、不可變資料 |
| 參考參數 | ref | 傳遞記憶體位址,直接操作原變數 | 呼叫前必須已初始化 | 雙向傳遞、修改呼叫端變數 |
| 輸出參數 | out | 同 ref,但語意為「只輸出」 | 呼叫前不需初始化;方法內必須賦值 | 多返回值、TryParse 模式 |
| 參數陣列 | params | 可變長度參數清單,內部為陣列 | 可傳 0~N 個引數或陣列 | 參數個數不固定的方法 |
using System;
class Test
{
// params 範例
static void F(params int[] args)
{
Console.WriteLine("Array contains {0} elements:", args.Length);
foreach (int i in args) Console.Write("{0} ", i);
Console.WriteLine();
}
// ref 範例
static void Swap(ref int a, ref int b)
{
int t = a; a = b; b = t;
}
// out 範例
static bool TryParseInt(string s, out int result)
{
return int.TryParse(s, out result);
}
public static void Main()
{
// params 呼叫三種形式
int[] a = { 1, 2, 3 };
F(a); // 傳陣列
F(10, 20, 30, 40); // 傳參數清單
F(); // 零參數
// ref 實測
int x = 1, y = 2;
Swap(ref x, ref y); // x=2, y=1
// out 實測
int val;
if (TryParseInt("123", out val)) Console.WriteLine(val); // 123
}
}
params 僅能出現在參數列表最後一個位置,且每個方法最多一個。ref/out 在 CLR 簽章中相同,僅中繼資料不同,編譯器強制區分語意。ref return、ref struct 等進階功能,擴展高效能場景應用。依需求選擇:單向輸入用值參數,需修改呼叫端變數用 ref,純輸出用 out,參數個數可變用 params。掌握語意差異,避免誤用導致 Bug。