Menu
CoddyTech

可选参数

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

可选参数让你可以为方法参数定义默认值。当调用者没有为该参数提供值时,系统会自动使用默认值。

在方法签名中为参数指定默认值,就能创建可选参数:

public static void Greet(string name, string greeting = "Hello")
{
    Console.WriteLine(greeting + ", " + name + "!");
}

// 两次调用都能正常运行
Greet("Alice");              // Hello, Alice!
Greet("Bob", "Welcome");     // Welcome, Bob!

可选参数必须放在所有必需参数之后。你可以有多个可选参数,调用函数时可以从右侧开始省略任意数量的参数:

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

CreateUser("Emma");                    // Emma, Age: 0, Active: True
CreateUser("James", 25);               // James, Age: 25, Active: True
CreateUser("Sarah", 30, false);        // Sarah, Age: 30, Active: False

默认值必须是编译时常量,例如字面量、const 值或 default 表达式。你不能使用变量或方法调用作为默认值。因此,可选参数非常适合用于配置设置,以及大多数调用者都会使用常见值的方法。

challenge icon

挑战

简单

我们来构建一个通知系统,使用可选参数灵活地设置消息格式。你将创建一个实用类,用可自定义的设置发送通知,而大多数调用者都可以使用合适的默认值。

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

  • NotificationService.cs:在 Notifications 命名空间中创建一个 NotificationService 类,并通过一个方法演示可选参数:
    • SendNotification(string message, string priority = "Normal", bool addTimestamp = true):此方法应返回格式化后的通知字符串。当 addTimestamp 为 true 时,在消息前添加 [TIMESTAMP]。根据时间戳设置,格式应为:[Priority] Message 或 [TIMESTAMP] [Priority] Message。
  • Program.cs:在主文件中,分别通过使用所有默认值、覆盖一个参数以及覆盖两个可选参数这三种方式调用 SendNotification,演示可选参数的工作方式。

你将收到三个输入:

  • 第一条消息(使用所有默认值)
  • 第二条消息(使用 "Urgent" 优先级,时间戳使用默认值)
  • 第三条消息(使用 "Low" 优先级,不添加时间戳)

调用 SendNotification 三次,并打印每次调用的结果:

  1. 第一次调用:只传入第一条消息(使用默认值:"Normal" 优先级,启用时间戳)
  2. 第二次调用:传入第二条消息和 "Urgent" 优先级(时间戳仍使用默认值 true)
  3. 第三次调用:传入第三条消息、"Low" 优先级以及作为时间戳参数的 false

例如,如果输入是 System started、Server overload 和 Cache cleared,输出应为:

[TIMESTAMP] [Normal] System started
[TIMESTAMP] [Urgent] Server overload
[Low] Cache cleared

请注意,同一个方法可以优雅地处理这三种情况。调用者只需指定需要修改的默认值!

亲手试试

using System;
using Notifications;

class Program
{
    public static void Main(string[] args)
    {
        // 读取三条消息
        string message1 = Console.ReadLine();
        string message2 = Console.ReadLine();
        string message3 = Console.ReadLine();

        // 创建一个 NotificationService 实例
        NotificationService service = new NotificationService();

        // TODO:调用 SendNotification 三次,并打印每次的结果:
        // 1. 第一次调用:只传入 message1(其他参数均使用默认值)
        // 2. 第二次调用:传入 message2,并将优先级设为 "Urgent"(timestamp 默认为 true)
        // 3. 第三次调用:传入 message3,将优先级设为 "Low",并将 timestamp 设为 false

    }
}
quiz icon自我测试

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

面向对象编程中的所有课

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