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

C# params 關鍵字:可變參數陣列的靈活應用與實作原理

     編輯:關於C語言

語法規則速覽

  • 只能出現在參數列表最後一個位置
  • 參數型別必須是一維陣列(T[])
  • 方法簽章中只能有一個 params 參數
  • 呼叫時可傳入 0~N 個引數,或直接傳入陣列實例

基本範例

using System;

class App {
    // 第一個參數固定為 int,後續可變參數為 object[]
    public static void UseParams(int id, params object[] list) {
        Console.WriteLine($"ID: {id}");
        foreach (var item in list) Console.WriteLine(item);
    }

    static void Main() {
        // 傳入 3 個字串
        UseParams(1, "a", "b", "c");
        // 傳入 4 個不同型別引數(隱含裝箱)
        UseParams(2, "d", 100, 33.33, new double[] { 1.1, 2.2 });
        // 直接傳入陣列
        UseParams(3, new object[] { "e", 200 });
        // 零參數
        UseParams(4);
        Console.ReadLine();
    }
}

輸出結果

ID: 1
a
b
c
ID: 2
d
100
33.33
System.Double[]
ID: 3
e
200
ID: 4

進階用法與陷阱

1. 型別安全:改用泛型 params

// C# 13+ (提案階段) 或手動封裝
public void Log(string format, params T[] args) { /* ... */ }
// 目前通用做法:params object[] + 文檔約定

2. 擴充方法搭配 params

public static class StringExtensions {
    public static string FormatWith(this string fmt, params object[] args)
        => string.Format(fmt, args);
}
// 用法: "Hello {0}, {1}".FormatWith("World", 2024);

3. 避免意外的陣列傳入


void Foo(params int[] nums) { }
int[] arr = {1,2,3};
Foo(arr);       // 傳入陣列本身,nums.Length == 3
Foo(1,2,3);     // 編譯器建立新陣列,nums.Length == 3
Foo(new[]{1,2}); // 同理

若需區分「單一陣列引數」與「多個引數」,請勿使用 params,改用多載:


void Bar(int[] arr) { }      // 明確接收陣列
void Bar(params int[] nums) { } // 編譯錯誤:多載模糊

4. 效能考量:避免熱路徑頻繁配置陣列

  • 每次呼叫 params 方法,編譯器都會在呼叫端產生 new object[] { ... }(或對應型別陣列)
  • 高頻路徑(如記錄器、數學運算)建議提供 params 版本供便利呼叫,核心邏輯用 ReadOnlySpan<T> 或陣列多載實作

內部實作原理

編譯器將 params 標記為 [ParamArrayAttribute],呼叫端 IL 會顯式 newarr 建立陣列並填入引數。這就是為什麼 params 僅限陣列型別且必須在最後的原因。

最佳實踐清單

  1. 參數語意明確為「同類型項目清單」時使用(如 string.Format、Console.WriteLine、Enumerable.Concat)
  2. 文檔標註預期元素型別(因 object[] 失去型別資訊)
  3. 提供非 params 陣列多載供高效能場景
  4. 避免在介面定義中使用 params(實作者易忘記加屬性)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved