Menu
CoddyTech

“params” 关键字

本课属于 Coddy C# 学习旅程的“面向对象编程”单元。第 47 课,共 70 课。

params 关键字允许方法接受数量可变且类型相同的参数。调用者无需手动创建数组,可以直接传入参数,并用逗号分隔。

在方法签名中,将 params 放在数组参数前面:

public static int Sum(params int[] numbers)
{
    int total = 0;
    foreach (int n in numbers)
        total += n;
    return total;
}

// 这些调用都能正常运行
Console.WriteLine(Sum(1, 2));           // 3
Console.WriteLine(Sum(1, 2, 3, 4, 5));  // 15
Console.WriteLine(Sum());               // 0(空数组)

编译器会自动将参数包装成数组。如果你已经有一个数组,也可以直接传入:

int[] values = { 10, 20, 30 };
Console.WriteLine(Sum(values));  // 60

有几条规则需要记住:一个方法只能有一个 params 参数,而且它必须是列表中的最后一个参数。你可以将它与普通参数组合使用:

public static void Log(string prefix, params object[] items)
{
    foreach (var item in items)
        Console.WriteLine(prefix + item);
}

Log("Item: ", "Apple", 42, true);

params 关键字让 API 更灵活,也更方便调用者使用,这就是为什么你会在 Console.WriteLine 和 string.Format 这样的方法中看到它。

challenge icon

挑战

简单

我们来构建一个灵活的消息格式化工具,使用 params 关键字处理任意数量的值。你将创建一个实用类,用可变参数格式化消息,了解 params 如何让方法更加灵活,也更方便调用者使用。

你将把代码分到两个文件中:

  • MessageFormatter.cs:在 Formatting 命名空间中创建一个 MessageFormatter 类,并添加两个使用 params 的方法:
    • Combine(params string[] parts):将提供的所有字符串用空格连接起来,并返回结果
    • FormatList(string label, params int[] numbers):将普通参数与 params 数组结合使用。它应返回标签,后接冒号,然后是用逗号分隔的所有数字(例如,Scores: 85, 90, 78)
  • Program.cs:在主文件中,通过输入演示这两个方法。读取一个标签字符串,然后读取一行逗号分隔的整数。使用 Combine 连接三个固定的单词,并使用 FormatList 显示标签和数字。

你会收到两个输入:

  • 一个标签字符串(例如,Scores)
  • 一个逗号分隔的整数列表(例如,85,90,78,92)

首先,用单词 "Hello"、"params" 和 "world!" 调用 Combine,并打印结果。然后将逗号分隔的整数解析为数组,并用标签和整数数组调用 FormatList,也打印出结果。

例如,如果输入是 Scores 和 85,90,78,输出应为:

Hello params world!
Scores: 85, 90, 78

注意,Combine 可以直接接受任意数量的字符串,而 FormatList 展示了你可以将普通参数与 params 结合使用,params 参数只需要放在最后。你也可以将现有数组传给使用 params 的方法,这正是你要对解析出的整数所做的!

亲手试试

using System;
using Formatting;

class Program
{
    public static void Main(string[] args)
    {
        // 读取输入
        string label = Console.ReadLine();
        string numbersInput = Console.ReadLine();
        
        // TODO: 用 MessageFormatter.Combine 组合 "Hello"、"params" 和 "world!"
        // 并打印结果
        
        
        // TODO: 将逗号分隔的整数解析为 int 数组
        // 提示:拆分字符串,并将每一部分转换为 int
        
        
        // TODO: 将 label 和 int 数组传给 MessageFormatter.FormatList
        // 并打印结果
        
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: C# 在线编译器