0

0

C# 模式匹配方法 C#如何使用is和switch进行模式匹配

幻夢星雲

幻夢星雲

发布时间:2026-02-07 09:57:09

|

353人浏览过

|

来源于php中文网

原创

is模式匹配不仅能判断类型,还可解构数据并过滤条件;switch表达式要求穷尽所有可能,而switch语句则无需覆盖全部情况。

c# 模式匹配方法 c#如何使用is和switch进行模式匹配

is 模式匹配:不只是类型判断,还能解构和条件过滤

is 在 C# 7.0+ 不再只是返回 bool 的类型检查操作符,它支持类型模式、常量模式、变量模式和属性模式。关键在于:**匹配成功时可同时声明并赋值变量**,避免重复转换。

  • 常见错误:写 if (obj is string s) { Use(s); } 却在 Use 外部访问 s —— s 作用域仅限于 if 块内
  • 嵌套解构:支持元组、位置模式(需类型定义 Deconstruct 方法),例如 if (obj is Point(int x, int y) p) 同时提取字段并绑定 p
  • as 对比:as 仅做引用/装箱转换且不支持模式;is 支持所有模式但不提供转换结果(除非用变量模式)
  • 性能无额外开销:编译器会优化为一次类型检查 + 字段读取,不生成多余对象

switch 表达式 vs switch 语句:选哪个取决于是否需要副作用

C# 8.0 引入 switch 表达式(返回值),C# 9.0 加入 switch 语句的模式增强。二者语法相似但语义不同:**表达式必须穷尽所有可能,语句则不需要**。

  • 表达式要求覆盖所有输入:编译器检查是否遗漏 _(弃元)或具体模式,否则报错 CS8509: The switch expression does not handle all possible inputs
  • 语句允许“不处理某些情况”:适合只关心特定子集的场景,比如日志中只记录已知错误码,其余忽略
  • 模式优先级:从上到下匹配,遇到第一个成功模式即停止;注意不要把泛化模式(如 object o)写在具体模式(如 string s)前面,否则后者永远不触发
  • 使用 when 添加守卫条件:例如 case int i when i > 0 => "positive",但守卫中避免耗时计算或副作用

常见陷阱:null、泛型约束与模式顺序问题

模式匹配看似直观,但在涉及 null、泛型类型参数或继承链时容易出错。

小K直播姬
小K直播姬

全球首款AI视频动捕虚拟直播产品

下载
  • null 匹配:类型模式(如 obj is string s)默认不匹配 null;若需接受 null,改用常量模式 obj is null 或联合模式 obj is string s or null
  • 泛型方法中无法直接对 T 使用类型模式(如 value is int),因为 T 在运行时可能被擦除;可行方案是用 typeof(T) == typeof(int) 配合 Convert.ChangeType,或约束为 struct 后用 switch 表达式处理已知具体类型
  • 继承关系误导:若 Derived 继承 Base,写 obj is Base b 会匹配所有子类实例,但不会解构 Derived 特有字段;要访问子类成员,必须明确写 obj is Derived d
  • switch 表达式中的 goto case 不可用:这是语句特性,表达式只支持 => 和逗号分隔的表达式

何时该用模式匹配而不是传统 if-else 或 as + is

模式匹配不是语法糖替代品,它的价值体现在**结构清晰性与编译期保障**上,尤其在处理多层嵌套数据或异构集合时。

  • 适合用模式匹配:解析 JSON-like 对象树(如 JsonElement)、状态机事件分发、AST 节点遍历、DTO 到领域模型映射
  • 不适合硬套:简单类型判断(如 if (x is int))反而增加阅读成本;高频调用路径中过度嵌套属性模式可能影响可读性与调试体验
  • 与 LINQ 结合:可在 WhereSelect 中用模式匹配过滤/投影,例如 list.OfType().Select(s => s.Length) 可替换为 list.Where(x => x is string).Cast().Select(s => s.Length),但更推荐直接用 list.OfType() 保持语义明确
  • 调试提示:VS 调试器能显示模式匹配变量的当前值,但复杂守卫条件(when)中的局部变量不会自动展开,需手动添加监视
实际项目中最容易被忽略的是模式穷尽性检查——它只在 switch 表达式中强制,而业务代码里大量使用 switch 语句时,新增一种类型却忘记更新分支,就会静默跳过逻辑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

430

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

541

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

string转int
string转int

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

606

2023.08.02

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

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

241

2023.09.22

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

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

621

2024.03.01

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

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

1514

2023.10.24

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

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

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