全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C# 模式匹配(Pattern Matching)的演进 - from is to switch expressions

C# 7 起引入模式匹配,逐步支持类型、常量、属性、解构等模式,通过 is 表达式和 switch 表达式实现简洁安全的数据判断与处理,提升代码可读性与安全性。

从 C# 7 开始,模式匹配(Pattern Matching)逐渐成为语言中强大而优雅的特性。它让开发者能以更简洁、更具表达力的方式进行类型判断和数据解构。这一能力从简单的 is 类型检查逐步演进到功能完整的 switch 表达式,体现了 C# 向函数式编程风格融合的趋势。

早期:基于 is 的类型模式

在 C# 7 之前,类型判断通常使用 is 关键字配合强制转换:

// 传统方式 if (obj is string) { string s = (string)obj; Console.WriteLine(s.Length); }

这种方式冗长且容易出错。C# 7 引入了“类型模式”的 is 语法,允许在判断的同时声明变量:

if (obj is string s) { Console.WriteLine(s.Length); // s 在此作用域内可用 }

这不仅减少了代码量,还避免了重复转换。类似的,还可以结合 when 子句进行条件过滤:

if (obj is string s && s.Length > 0) { Console.WriteLine($"非空字符串: {s}"); }

扩展:常量模式与属性模式

除了类型,模式匹配也支持常量和对象结构的判断。

常量模式可用于判断值是否等于某个常量:

if (value is null) { ... } if (input is "quit") { ... }

属性模式则允许你根据对象的属性结构进行匹配。例如判断一个点是否位于原点:

if (point is { X: 0, Y: 0 }) { Console.WriteLine("原点"); }

也可以嵌套使用:

if (person is { Address: { City: "Beijing", ZipCode: "100000" } }) { Console.WriteLine("北京用户"); }

这种写法清晰表达了“数据形状”的意图,比层层 if 判断更直观。

跃迁:switch 语句到 switch 表达式

传统的 switch 语句只能用于常量标签,且语法繁琐。C# 8 开始引入 switch 表达式,支持任意类型的模式,并返回值。

看一个例子:将数字转换为描述字符串。

string description = number switch { 0 => "零", 1 => "一", >= 2 and "个位数", _ => "其他" };

这里使用了:

  • 常量模式:0、1
  • 关系模式:>= 2
  • 逻辑组合:and 连接多个条件
  • 弃元模式:_ 匹配所有情况

switch 表达式是表达式,必须覆盖所有可能路径或提供默认分支,编译器会做**穷尽性检查**,提升代码安全性。

高级用法:解构与位置模式

如果类型实现了 Deconstruct 方法,就可以在模式中使用解构模式

public class Point { public int X { get; } public int Y { get; } public Point(int x, int y) => (X, Y) = (x, y); public void Deconstruct(out int x, out int y) => (x, y) = (X, Y); }

然后可以直接在 switch 中解构:

var result = point switch { (0, 0) => "原点", (0, _) => "Y轴上", (_, 0) => "X轴上", var (x, y) when x == y => "在 y=x 线上", _ => "其他位置" };

这种写法非常接近数学表达,极大提升了可读性。

总结

C# 的模式匹配从最初的 is 类型检查,发展到支持属性、关系、逻辑组合和解构的完整系统,最终通过 switch 表达式实现函数式风格的数据处理。它让代码更简洁、安全、富有表达力。现代 C# 开发中,合理使用模式匹配可以显著减少样板代码,提高逻辑清晰度。

基本上就这些。


# switch  # c#  # 作用域  # 代码可读性  # String  # NULL  # 常量  # if  # 字符串  # int  # void  # class  # public  # Length  # var  # console  # number  # 对象  # input  # 这一  # 子句  # 还可以  # 多个  # 在此  # 线上  # 可以直接  # 数据处理  # 发展到  # 更具 


相关文章: 网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  大同网页,大同瑞慈医院官网?  如何通过西部数码建站助手快速创建专业网站?  如何在Golang中使用replace替换模块_指定本地或远程路径  网站微信制作软件,如何制作微信链接?  如何获取上海专业网站定制建站电话?  建站之星如何修改网站生成路径?  如何在阿里云虚拟主机上快速搭建个人网站?  c++怎么用jemalloc c++替换默认内存分配器【性能】  制作网站的软件免费下载,免费制作app哪个平台好?  如何快速配置高效服务器建站软件?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  实例解析Array和String方法  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何用好域名打造高点击率的自主建站?  网站制作免费,什么网站能看正片电影?  如何用免费手机建站系统零基础打造专业网站?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  海南网站制作公司有哪些,海口网是哪家的?  宝塔新建站点为何无法访问?如何排查?  如何选择服务器才能高效搭建专属网站?  制作营销网站公司,淘特是干什么用的?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  建站之星后台密码遗忘如何找回?  建站之星上传入口如何快速找到?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  高防服务器如何保障网站安全无虞?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  建站主机默认首页配置指南:核心功能与访问路径优化  成都网站制作公司哪家好,四川省职工服务网是做什么用?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何在阿里云购买域名并搭建网站?  建站VPS选购需注意哪些关键参数?  大连网站制作公司哪家好一点,大连买房网站哪个好?  如何用PHP工具快速搭建高效网站?  网站制作企业,网站的banner和导航栏是指什么?  如何通过IIS搭建网站并配置访问权限?  如何配置支付宝与微信支付功能?  定制建站流程步骤详解:一站式方案设计与开发指南  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  香港服务器租用每月最低只需15元?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  建站主机选购指南:核心配置优化与品牌推荐方案  公司门户网站制作流程,华为官网怎么做? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。