首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 參數傳遞機制全解析:ref、out、params 與傳值/傳址差異

     編輯:關於C語言

四種參數形式

C# 方法參數預設為傳值(值型別複製內容,參考型別複製參考)。若需在方法內修改引數本身,需使用 ref、out 或 params。

1. ref 參數(雙向傳遞)

  • 呼叫端變數必須先初始化。
  • 方法內修改會反映到呼叫端變數。
public static void RefTest(ref int val)
{
    val += 2;
}

static void Main()
{
    int i = 3; // 必須初始化
    RefTest(ref i);
    Console.WriteLine(i); // 輸出 5
}

2. out 參數(單向輸出)

  • 呼叫端變數不需初始化,但方法必須在所有路徑賦值。
  • 常用於需回傳多個值的場景。
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
}

3. params 參數陣列(可變參數)

  • 允許呼叫端傳入 0~N 個同類型引數,或單一陣列。
  • 方法內視為陣列處理。
  • 每個方法最多一個params,且必須是最後一個參數。
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 或自訂型別替代)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved