模式匹配(在最近的 C# 版本中大幅扩展)让你简洁地测试值的形状、类型和属性,并提取数据——比嵌套的 if-else 链条清晰得多。它与 switch 表达式、is 等一起使用。
类型模式和 is 运算符
(obj s)
Console.WriteLine(s.Length);
(obj n > )
Console.WriteLine();
is 运算符与类型模式一起在一个步骤中测试类型并捕获值(带类型)——比分别进行检查然后强制转换更简洁。
string Describe(object obj) => obj switch
{
int n when n > 0 => "positive int", // type + condition (when)
int => "non-positive int",
string { Length: > 10 } => "long string", // property pattern
null => "null",
_ => "other", // default
};
switch 表达式支持丰富的模式:类型模式、条件(when)和属性模式({ Length: > 10 }——匹配对象的属性)——简洁地表达复杂的分支逻辑。
// property pattern — match on properties
var discount = customer switch
{
{ IsVip: true, Orders: > 100 } => 0.2, // multiple property conditions
{ Orders: > 50 } => 0.1,
_ => 0.0,
};
// relational + logical patterns (C# 9)
string Size(int n) => n switch
{
< 0 => "negative",
0 => "zero",
> 0 and < 100 => "small", // relational (< >) + logical (and/or/not)
_ => "large",
};
var (x, y) = point; // positional/deconstruction
int[] arr = { 1, 2, 3 };
if (arr is [1, .., 3]) { } // list pattern (C# 11) — starts with 1, ends with 3
模式匹配是现代 C# 中一个重要且日益核心的功能——它在最近的版本中大幅扩展,改变了 C# 处理条件逻辑和类型检查的方式,因此理解它对于编写和阅读当前的 C# 代码很有价值。
它的核心价值在于简洁而清晰地表达复杂的条件逻辑:与其使用嵌套的 if-else 链条、分别进行类型检查、强制转换和属性访问,不如使用模式匹配来测试值的类型、条件、属性和结构——并以清晰、声明式的表达式提取数据(特别是使用 switch 表达式)。
模式的广泛范围——类型模式(通过 is 在一个步骤中测试和捕获类型)、属性模式(匹配对象属性)、关系和逻辑模式(< 100 and > 0、not)以及列表/位置模式——优雅地涵盖了广泛的分支逻辑。
这反映了现代 C# 朝向更具函数式、更具表达力的代码的演变,模式匹配在当前的代码库中随处可见(特别是在 switch 表达式和记录中)。
理解各种模式及其使用方式(使用 is、switch 表达式、when 子句)对于编写简洁、可读的现代 C# 以及阅读使用这些功能的代码很重要。
由于模式匹配用清晰、声明式的表达式取代了冗长的条件逻辑——提高了可读性并减少了错误——而且由于它是现代 C# 的一个定义特性且在不断扩展,精通它是一种有价值的、频繁应用的知识,它将熟练的现代 C# 与较旧、更冗长的风格区分开来,并且是一个日益常见的面试主题。
一个包含详细解答的 IT 面试题库——从初级到高级。
捐赠