答案是.NET中的模式匹配通过类型模式、switch表达式和属性模式简化类型判断与分支逻辑。它从C# 7.0开始引入,支持在is表达式中直接声明变量,避免强制转换;C# 8提供switch表达式,使用=>返回结果,结合when过滤条件,提升代码简洁性与可读性;属性模式则按对象结构匹配,如根据Person的Age和Name属性值分类,减少冗余if-else,增强维护性。

.NET中的模式匹配是一种语言特性,允许你以更简洁、更具表达力的方式检查对象的类型和结构,并根据这些条件执行不同的逻辑。它从C# 7.0开始引入,并在后续版本中不断增强。相比传统的 if-else 和 switch 判断,模式匹配能显著减少冗余代码,提升可读性和维护性。
1. 类型模式(Type Pattern)——替代 is 类型判断
传统写法中,我们常这样判断类型并转换:
if (obj is string) {
string s = (string)obj;
Console.WriteLine($"字符串长度:{s.Length}");
}
else if (obj is int) {
int i = (int)obj;
Console.WriteLine($"整数值的两倍:{i * 2}");
}
使用类型模式,可以直接在 is 表达式中声明变量:
if (obj is string s) {
Console.WriteLine($"字符串长度:{s.Length}");
}
else if (obj is int i) {
Console.WriteLine($"整数值的两倍:{i * 2}");
}
变量 s 和 i 只在对应的代码块中有效,避免了强制转换和作用域混乱。
2. switch 表达式(Switch Expression)——更简洁的多路分支
C# 8 引入了 switch 表达式,支持模式匹配,语法更紧凑,返回值也更清晰。
比如处理不同类型的对象:
var result = obj switch
{
null => "空值",
string s when s.Length == 0 => "空字符串",
string s => $"字符串:{s}, 长度 {s.Length}",
int i when i < 0 => $"负整数:{i}",
int i => $"正整数或零:{i}",
_ => "未知类型"
};
特点:
- 使用 => 直接返回结果,无需 break
- 支持条件过滤(when 子句)
- 必须覆盖所有情况,否则编译器警告(可用 _ 作为默认)
3. 属性模式(Property Pattern)——按对象结构匹配
当需要根据对象的属性值做判断时,属性模式非常有用。
例如有这样一个类:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
你可以这样匹配:
var person = new Person { Name = "Alice", Age = 25 };
var category = person switch
{
{ Age: < 13 } => "儿童",
{ Age: >= 13 and <= 19 } => "青少年",
{ Age: > 19 } and { Name: "Admin" } => "成年管理员",
{ Age: > 19 } => "成年人",
_ => "未知"
};
这里 { Age: 就是属性模式,直接解构属性进行比较。
4. 位置模式(Positional Pattern)——配合 Deconstruct 使用
对于支持解构的对象(如元组、记录类型),可以按位置匹配。
(string name, int age) = ("Bob", 30);
var desc = (name, age) switch
{
("Alice", 25) => "特定用户",
(, 0) => "年龄为0",
(var n, var a) when a > 18 => $"成人:{n}",
=> "其他"
};
记录类型(record)天然支持位置解构,非常适合模式匹配。
基本上就这些。用好模式匹配,可以让原本冗长的条件判断变得清晰又优雅,特别适合处理多种输入类型或复杂业务规则的场景。不复杂但容易忽略。










