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 语句只能用于常量标签,且语法繁琐。C# 8 开始引入 switch 表达式,支持任意类型的模式,并返回值。
可以生成十多种编程语言的工作代码,基于 OpenAI GPT-3 的自然语言处理模型
144 看一个例子:将数字转换为描述字符串。
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# 开发中,合理使用模式匹配可以显著减少样板代码,提高逻辑清晰度。
基本上就这些。
以上就是C# 模式匹配(Pattern Matching)的演进 – from is to expressions的详细内容,更多请关注php中文网其它相关文章!
微信扫一扫打赏
支付宝扫一扫打赏
