在 C# 中,params 关键字的作用是:允许方法接受可变数量的参数(不定长参数),而无需显式传入数组。

这是 C# 提供的一种语法糖,让调用方法时更简洁、直观。


✅ 1. 基本用法

你可以在方法的最后一个参数上使用 params,该参数必须是一维数组类型

示例:
public static void PrintNumbers(params int[] numbers)
{
    foreach (int num in numbers)
    {
        Console.WriteLine(num);
    }
}
调用方式(两种都行):

方式1:直接传多个参数(推荐,简洁)

PrintNumbers(1, 2, 3, 4); // 自动打包成 int[] {1, 2, 3, 4}

方式2:显式传数组

int[] arr = { 5, 6, 7 };
PrintNumbers(arr);

💡 注意:params 参数必须是方法的最后一个参数,且一个方法只能有一个 params 参数。


✅ 2. 实际应用场景

场景1:日志记录
public static void Log(string format, params object[] args)
{
    string message = string.Format(format, args);
    Console.WriteLine(message);
}

// 调用
Log("Hello {0}, you have {1} messages.", "Alice", 5);

🔔 这其实就是 Console.WriteLine 的实现原理!

场景2:求和、拼接等聚合操作
public static int Sum(params int[] values)
{
    int total = 0;
    foreach (int v in values) total += v;
    return total;
}

// 调用
int result = Sum(10, 20, 30); // 返回 60

⚠️ 注意事项

规则 说明
只能用于最后一个参数 void Foo(int x, params string[] args)
void Foo(params string[] args, int x)
只能有一个 params 参数 不能写两个 params
可以传 0 个参数 PrintNumbers();numbers 是一个空数组(不是 null)
性能提示 每次调用都会创建一个新数组(堆分配),高频调用需注意性能

✅ 3. 和普通数组参数的区别?

写法 调用方式 是否灵活
void M(int[] arr) 必须传数组:M(new int[]{1,2}) ❌ 不灵活
void M(params int[] arr) 可传多个数:M(1,2) 或传数组 ✅ 更灵活

所以,如果你希望方法既能接受“多个独立参数”,又能接受“数组”,就用 params


📌 小结

  • params 让方法支持可变参数列表
  • 语法:返回类型 方法名(params 类型[] 参数名)
  • 调用时可以直接写多个值,C# 会自动包装成数组。
  • 常用于 Console.WriteLine、日志、工具方法等场景。

问题

为什么带有params修饰符的参数必须位于参数列表的最后?

因为如果他不是最后一个,且后面还有另一个参数,编译器将无法确定该参数是否属于params数组。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐