0

0

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

星降

星降

发布时间:2025-12-13 22:25:24

|

395人浏览过

|

来源于php中文网

原创

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

c# 模式匹配(pattern matching)的演进 - from is to switch expressions

从 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 表达式,支持任意类型的模式,并返回值。

PhotoG
PhotoG

PhotoG是全球首个内容营销端对端智能体

下载

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

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# 开发中,合理使用模式匹配可以显著减少样板代码,提高逻辑清晰度。

基本上就这些。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

436

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

746

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

532

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

412

2024.03.13

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

前端系列快速入门课程
前端系列快速入门课程

共4课时 | 0.4万人学习

C# 教程
C# 教程

共94课时 | 6.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号