c# 模式匹配有什么用
技术百科
煙雲
发布时间:2026-01-21
浏览: 次 模式匹配是C#中高效处理不确定数据的核心工具,能一体化完成类型检查、变量绑定和值判断,显著减少if-else、类型转换和null检查。
模式匹配不是语法糖,它是 C# 里真正能帮你「少写 if-else、少做类型转换、少判 null」的生产力工具。用对了,代码更短、分支更清晰、错误更早暴露。
替代冗长的类型判断和强制转换
传统写法要先 is 判断类型,再用 as 转换,最后还要判空——三步才能安全取值。模式匹配一步到位:
if (obj is string s && s.Length > 0)
{
Console.WriteLine($"非空字符串: {s}");
}
// ✅ 类型检查 + 变量绑定 + 值判断,全在一行完成- 不用
as string再判s != null,is 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自动绑定 - 如果
point是null,整个is表达式直接为false,不会抛NullReferenceException - 不用手动写
point?.X ?? 0这类防御式代码,逻辑更贴近意图
最常被忽略的一点:模式匹配不是“炫技功能”,它和可空引用(string?)、记录类型(record)、switch 表达式是协同演进的。单独用某一个,效果打折;一起用,才真正消除大量样板 null 检查、类型转换和边界判断。别把它当成高级特性去学,就当它是 C# 处理「不确定数据」的标准方式——就像你默认用 foreach 而不是手写 for 循环一样自然。
# 而不是
# 这类
# 帮你
# 把它
# 它是
# 绑定
# 跳过
# 这两个
# 工具
# go
# 循环
# 对象
# 堆
# String
# if
# 值类型
# c#
# 报错
# var
# NULL
# foreach
# 不确定
# switch
# 类型转换
# for
# enum
# 报错提示
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- PhpStorm怎么调试PHP代码_PhpStor
- Win11怎么更改鼠标指针方案_Windows11
- 如何在Golang中实现文件下载_Golang文件
- Windows10系统怎么查看设备管理器_Win1
- Win11怎么关闭键盘按键音_Win11禁用打字声
- Win11怎么制作U盘启动盘_Win11原版系统安
- Python邮件系统自动化教程_批量发送解析与模板
- 如何在Golang中修改数组元素_通过指针实现原地
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- Mac如何设置动态壁纸?(让桌面动起来)
- Win11文件夹预览图不显示怎么办_Win11缩略
- php中self::能调用子类重写的方法吗_静态绑
- Windows10如何更改桌面背景_Win10个性
- php485函数执行慢怎么优化_php485性能提
- PHP主流架构如何做单元测试_工具与流程【详解】
- PHP 中如何在函数内持久修改引用变量所指向的目标
- Python生成器表达式内存优化_惰性计算说明【指
- Win10如何备份注册表_Win10注册表备份步骤
- php删除数据怎么加限制_带where条件删除避免
- php订单日志怎么按状态筛选_php筛选不同状态订
- Linux如何使用Curl发送请求_Linux下A
- Win11时间不对怎么同步_Win11自动校准互联
- Win11输入法切换快捷键怎么改_Windows
- 如何使用Golang进行HTTP服务性能测试_测量
- PythonWeb前后端整合项目教程_FastAP
- C++如何将C风格字符串(char*)转换为std
- 如何使用Golang构建简易投票统计功能_Gola
- Win11怎么更改文件夹图标_自定义Win11文件
- 如何使用Golang匿名函数_快速定义临时函数逻辑
- Windows10怎么备份注册表_Windows1
- Win11怎么卸载Photos应用_Win11卸载
- 如何使用Golang实现路由参数绑定_使用Mux和
- Go语言中正确反序列化多个同级XML元素为结构体切
- Golang如何测试HTTP中间件_Golang
- Windows10如何查看蓝屏日志_Win10使用
- Win11怎样安装网易云音乐_Win11安装网易云
- c++如何判断文件是否存在_c++ filesys
- php8.4如何配置ssl证书_php8.4htt
- 如何在Golang中写入XML文件_生成符合规范的
- 如何使用Golang sort排序切片_Golan
- Win11怎么开启移动热点_Windows11共享
- php查询数据怎么导出csv_查询结果转csv文件
- Windows10怎么查看硬件信息_Windows
- Win11怎么设置闹钟_Windows 11时钟应
- c++如何使用std::bitset进行位图算法_
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- Python多线程使用规范_线程安全解析【教程】
- php8.4匿名类怎么用_php8.4匿名类创建与
- Windows10电脑怎么设置自动连接WiFi_W
- 如何使用Golang实现跨域请求支持_Golang

QQ客服