模式匹配不是语法糖,它是 C# 里真正能帮你「少写 if-else、少做类型转换、少判 null」的生产力工具。用对了,代码更短、分支更清晰、错误更早暴露。
替代冗长的类型判断和强制转换
传统写法要先
is判断类型,再用
as转换,最后还要判空——三步才能安全取值。模式匹配一步到位:
if (obj is string s && s.Length > 0)
{
Console.WriteLine($"非空字符串: {s}");
}
// ✅ 类型检查 + 变量绑定 + 值判断,全在一行完成
不用 as string再判
s != null,
is string s已隐含非 null 绑定 如果只想要类型判断(不绑定变量),直接写
obj is string即可 若类型不匹配,
s变量根本不会声明,编译器报错提示清晰
让 switch 表达式真正“表达逻辑”,而不是堆 case
C# 的
switch表达式配合模式匹配,能天然处理数值范围、多类型混合、属性约束等场景,不再需要一堆
if (x >= 18 && x 。
string category = age switch
{
< 13 => "儿童",
>= 13 and < 18 => "青少年",
>= 18 and < 65 => "成人",
_ => "老年人"
};
是关系模式,<code>and是逻辑模式,
_是弃元模式——全部原生支持,无需额外方法 返回值类型由所有分支统一推导,避免
switch语句中漏写
return或类型不一致的问题 编译器会检查是否穷尽(尤其对
enum或密封类型),漏写
_直接报错
安全解构 record 和自定义类型,跳过 null 检查陷阱
对
record或带
Deconstruct方法的类,可用属性模式或位置模式直接提取字段,且自动跳过 null 引用异常:
if (point is Point { X: var x, Y: var y } && x > 0 && y > 0)
{
Console.WriteLine($"第一象限点: ({x}, {y})");
}
Point { X: var x, Y: var y } 是属性模式:只匹配有这两个可读属性的对象,且 x/
y自动绑定 如果
point是
null,整个
is表达式直接为
false,不会抛
NullReferenceException不用手动写
point?.X ?? 0这类防御式代码,逻辑更贴近意图
最常被忽略的一点:模式匹配不是“炫技功能”,它和可空引用(
string?)、记录类型(
record)、switch 表达式是协同演进的。单独用某一个,效果打折;一起用,才真正消除大量样板 null 检查、类型转换和边界判断。别把它当成高级特性去学,就当它是 C# 处理「不确定数据」的标准方式——就像你默认用
foreach而不是手写
for循环一样自然。
