模式匹配介绍
C# 7 引入了基本模式匹配功能。 在 C# 8 至 C# 10 中,通过新增表达式和模式扩展了这些功能。
“模式匹配”是一种测试表达式是否具有特定特征的方法。 C# 模式匹配提供更简洁的语法,用于测试表达式并在表达式匹配时采取措施。
以下 C# 表达式和语句支持模式匹配:
- is 表达式
- switch 选择语句
- switch 表达式 (在 C# 8.0 中引入)
模式
声明和类型模式
使用声明和类型模式检查表达式的运行时类型是否与给定类型兼容。
借助声明模式,还可声明新的局部变量。
当声明模式与表达式匹配时,将为该变量分配转换后的表达式结果,如以下示例所示:
object greeting = "Hello, World!";
if (greeting is string message)
{
Console.WriteLine(message.ToLower()); // output: hello, world!
}
从 C# 7.0 开始,类型为 T
的声明模式在表达式结果为非 NULL 且满足以下任一条件时与表达式匹配:
-
表达式结果的运行时类型为
T
。 -
表达式结果的运行时类型派生自类型
T
,实现接口T
,或者存在从其到T
的另一种隐式引用转换。 -
表达式结果的运行时类型是具有基础类型
T
的可为 null 的值类型。
常量模式
从 C# 7.0 开始,可使用常量模式来测试表达式结果是否等于指定的常量,如以下示例所示:
public static decimal GetGroupTicketPrice(int visitorCount) => visitorCount switch
{
1 => 12.0m,
2 => 20.0m,
3 => 27.0m,
4 => 32.0m,
0 => 0.0m,
_ => throw new ArgumentException($"Not supported number of visitors: {visitorCount}", nameof(visitorCount)),
};
在常量模式中,可使用任何常量表达式,例如:
- integer 或 floating-point 数值文本
- 字符型
- 字符串字面量。
- 布尔值
true
或false
- enum 值
- 声明