Menu
CoddyTech

命名参数

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

命名参数让你可以通过参数名指定哪个参数接收某个值,而不必依赖参数的位置。这样可以让方法调用更清晰,还能按任意顺序传递参数。

在值前写上参数名,后面跟一个冒号:

public static void CreateUser(string name, int age, bool isActive)
{
    Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}

// 使用命名参数
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob");  // 顺序不限

命名参数与可选参数搭配使用时非常方便。你不必提供前面所有可选值,可以直接指定你需要的参数:

public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
    Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}

// 跳过 port 和 useSSL,只指定 timeout
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);

你可以混合使用位置参数和命名参数,但位置参数必须放在前面。命名参数能提高代码的可读性,尤其是在方法有多个相同类型的参数,或包含仅凭值无法判断含义的布尔标志时。

challenge icon

挑战

简单

让我们构建一个报告生成器,利用命名参数让方法调用一目了然。当方法有多个参数时,尤其是参数类型相同或包含布尔标志时,命名参数能让代码清楚地说明自身的意图。

你将把代码放在两个文件中:

  • ReportGenerator.cs:在 Reports 命名空间中创建一个 ReportGenerator 类,并为它添加一个带有多个可选参数的方法:
    • GenerateReport(string title, string author = "Anonymous", bool includeHeader = true, bool includeSummary = false, int maxPages = 10)
    • 此方法应返回一个格式化字符串,用于说明报告的配置
    • 格式:Report: {title} by {author} | Header: {Yes/No}, Summary: {Yes/No}, Max Pages: {maxPages}
  • Program.cs:在主文件中,通过不同方式调用 GenerateReport,展示命名参数的优势:跳过不需要的可选参数,只指定每份报告所需的参数。

你将收到三个输入:

  • 第一份报告的标题
  • 第二份报告的标题
  • 第三份报告的标题

使用不同配置生成三份报告:

  1. 第一份报告:只使用标题(其余参数使用默认值)
  2. 第二份报告:使用标题,并设置 includeSummary: true 和 maxPages: 25(跳过 author 和 includeHeader,保留它们的默认值)
  3. 第三份报告:使用标题,并设置 author: "Admin"、includeHeader: false 和 includeSummary: true(maxPages 使用默认值)

将每份报告的结果各打印在单独一行。

例如,如果输入是 Sales Q1、Annual Review 和 Inventory Check,输出应为:

Report: Sales Q1 by Anonymous | Header: Yes, Summary: No, Max Pages: 10
Report: Annual Review by Anonymous | Header: Yes, Summary: Yes, Max Pages: 25
Report: Inventory Check by Admin | Header: No, Summary: Yes, Max Pages: 10

注意,命名参数让你可以直接跳到关心的参数,而不必为了更改 includeSummary 而指定 author 或 includeHeader。这样,方法调用会更易读,也更能清楚表达意图!

亲手试试

using System;
using Reports;

class Program
{
    public static void Main(string[] args)
    {
        // 读取三个报告标题
        string title1 = Console.ReadLine();
        string title2 = Console.ReadLine();
        string title3 = Console.ReadLine();

        // 创建一个 ReportGenerator 实例
        ReportGenerator generator = new ReportGenerator();

        // TODO:生成第一份报告,只使用标题(其他参数均使用默认值)
        

        // TODO:生成第二份报告,使用标题,并设置 includeSummary: true 和 maxPages: 25
        // (不传入 author 和 includeHeader,保留它们的默认值)
        

        // TODO:生成第三份报告,使用标题,并设置 author: "Admin"、includeHeader: false 和 includeSummary: true
        // (保留 maxPages 的默认值)
        

        // 输出每份报告的结果
    }
}
quiz icon自我测试

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

面向对象编程中的所有课

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