可选参数
本课属于 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 表达式。你不能使用变量或方法调用作为默认值。因此,可选参数非常适合用于配置设置,以及大多数调用者都会使用常见值的方法。
挑战
简单我们来构建一个通知系统,使用可选参数灵活地设置消息格式。你将创建一个实用类,用可自定义的设置发送通知,而大多数调用者都可以使用合适的默认值。
你将把代码分别放在两个文件中:
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 三次,并打印每次调用的结果:
- 第一次调用:只传入第一条消息(使用默认值:
"Normal"优先级,启用时间戳) - 第二次调用:传入第二条消息和
"Urgent"优先级(时间戳仍使用默认值 true) - 第三次调用:传入第三条消息、
"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
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: C# 在线编译器