c# 模式匹配有什么用

模式匹配是C#中高效处理不确定数据的核心工具,能一体化完成类型检查、变量绑定和值判断,显著减少if-else、类型转换和null检查。

c# 模式匹配有什么用

模式匹配不是语法糖,它是 C# 里真正能帮你「少写 if-else、少做类型转换、少判 null」的生产力工具。用对了,代码更短、分支更清晰、错误更早暴露。

替代冗长的类型判断和强制转换

传统写法要先 is 判断类型,再用 as 转换,最后还要判空——三步才能安全取值。模式匹配一步到位:

if (obj is string s && s.Length > 0)
{
    Console.WriteLine($"非空字符串: {s}");
}
// ✅ 类型检查 + 变量绑定 + 值判断,全在一行完成
  • 不用 as string 再判 s != nullis 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 => "成人",
    _ => "老年人"
};
  • 是关系模式,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 自动绑定
  • 如果 pointnull,整个 is 表达式直接为 false,不会抛 NullReferenceException
  • 不用手动写 point?.X ?? 0 这类防御式代码,逻辑更贴近意图

最常被忽略的一点:模式匹配不是“炫技功能”,它和可空引用(string?)、记录类型(record)、switch 表达式是协同演进的。单独用某一个,效果打折;一起用,才真正消除大量样板 null 检查、类型转换和边界判断。别把它当成高级特性去学,就当它是 C# 处理「不确定数据」的标准方式——就像你默认用 foreach 而不是手写 for 循环一样自然。

https://www.php.cn/faq/2011988.html

发表回复

Your email address will not be published. Required fields are marked *