新闻中心

.NET中的模式匹配(Pattern Matching)是什么?如何用它简化复杂的if-else和switch?

2025-11-18
浏览次数:
返回列表
答案是.NET中的模式匹配通过类型模式、switch表达式和属性模式简化类型判断与分支逻辑。它从C# 7.0开始引入,支持在is表达式中直接声明变量,避免强制转换;C# 8提供switch表达式,使用=>返回结果,结合when过滤条件,提升代码简洁性与可读性;属性模式则按对象结构匹配,如根据Person的Age和Name属性值分类,减少冗余if-else,增强维护性。

.net中的模式匹配(pattern matching)是什么?如何用它简化复杂的if-else和switch?

.NET中的模式匹配是一种语言特性,允许你以更简洁、更具表达力的方式检查对象的类型和结构,并根据这些条件执行不同的逻辑。它从C# 7.0开始引入,并在后续版本中不断增强。相比传统的 if-elseswitch 判断,模式匹配能显著减少冗余代码,提升可读性和维护性。

1. 类型模式(Type Pattern)——替代 is 类型判断

传统写法中,我们常这样判断类型并转换:

if (obj is string) {
    string s = (string)obj;
    Console.WriteLine($"字符串长度:{s.Length}");
}
else if (obj is int) {
    int i = (int)obj;
    Console.WriteLine($"整数值的两倍:{i * 2}");
}

使用类型模式,可以直接在 is 表达式中声明变量:

if (obj is string s) {
    Console.WriteLine($"字符串长度:{s.Length}");
}
else if (obj is int i) {
    Console.WriteLine($"整数值的两倍:{i * 2}");
}

变量 si 只在对应的代码块中有效,避免了强制转换和作用域混乱。

2. switch 表达式(Switch Expression)——更简洁的多路分支

C# 8 引入了 switch 表达式,支持模式匹配,语法更紧凑,返回值也更清晰。

比如处理不同类型的对象:

var result = obj switch
{
    null => "空值",
    string s when s.Length == 0 => "空字符串",
    string s => $"字符串:{s}, 长度 {s.Length}",
    int i when i < 0 => $"负整数:{i}",
    int i => $"正整数或零:{i}",
    _ => "未知类型"
};

特点:

  • 使用 => 直接返回结果,无需 break
  • 支持条件过滤(when 子句)
  • 必须覆盖所有情况,否则编译器警告(可用 _ 作为默认)

3. 属性模式(Property Pattern)——按对象结构匹配

当需要根据对象的属性值做判断时,属性模式非常有用。

Whimsical Whimsical

Whimsical推出的AI思维导图工具

Whimsical 182 查看详情 Whimsical

例如有这样一个类:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

你可以这样匹配:

var person = new Person { Name = "Alice", Age = 25 };
<p>var category = person switch
{
{ Age: < 13 } => "儿童",
{ Age: >= 13 and <= 19 } => "青少年",
{ Age: > 19 } and { Name: "Admin" } => "成年管理员",
{ Age: > 19 } => "成年人",
_ => "未知"
};</p>

这里 { Age: 就是属性模式,直接解构属性进行比较。

4. 位置模式(Positional Pattern)——配合 Deconstruct 使用

对于支持解构的对象(如元组、记录类型),可以按位置匹配。

(string name, int age) = ("Bob", 30);
<p>var desc = (name, age) switch
{
("Alice", 25) => "特定用户",
(<em>, 0) => "年龄为0",
(var n, var a) when a > 18 => $"|成人|:{n}",
</em> => "其他"
};</p>

记录类型(record)天然支持位置解构,非常适合模式匹配。

基本上就这些。用好模式匹配,可以让原本冗长的条件判断变得清晰又优雅,特别适合处理多种输入类型或复杂业务规则的场景。不复杂但容易忽略。

以上就是.NET中的模式匹配(Pattern Matching)是什么?如何用它简化复杂的if-else和switch?的详细内容,更多请关注其它相关文章!


# 并在  # 肇庆网络推广seo方案  # 关于新年的新媒体营销推广短视频  # Cs模式网站建设  # 如何利用AI做营销推广  # 如何营销唇膏店铺推广  # 泰州互联网网站优化供应  # 网络营销口碑推广方法  # 上饶电商营销推广哪个好  # 常德网站建设信息  # 郑州高端网站推广定制  # 中文网  # 相关文章  # go  # 你可以  # 子句  # 是一种  # 如何用  # 两倍  # 如何使用  # 用它  # .net  # 作用域  # c#  # switch 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: C#中解析不规范的HTML为XML 常见的坑与解决办法  动漫花园资源网使用步骤_动漫花园资源网下载流程  Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略  age动漫网站入口 age动漫官网直接访问入口  php源码怎么看淘宝客系统_看php源码淘宝客系统技巧  Composer的 "check-platform-reqs" 命令有什么用_在部署前检查生产环境是否满足Composer依赖需求  深入理解J*a合成构造器:何时以及为何阻止其生成  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  双系统安装时,如何设置默认启动系统? msconfig命令了解一下!  Eclipse怎么运行工程_Eclipse工程运行配置说明  Win11 BitLocker密码忘了怎么办 Win11找回BitLocker恢复密钥方法【解决】  J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程  Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略  2026春节假期票务安排_2026春节放假购票指南  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  利用5118提升短视频内容效果_5118短视频关键词优化方法  火锅吃太多会怎样 火锅吃太多会上火吗  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  excel怎么制作工资条 excel快速生成工资条的方法  J*aScript设计模式实践_j*ascript代码优化  Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  Lar*el DB::listen 事件中的查询执行时间单位解析  UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】  mc.js官网登录入口 mc.js官方登录入口最新版  在Socket.IO连接中实现Access Token自动更新与动态重连  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  铁路12306的积分有效期是多久_铁路12306积分有效期说明  期待已久:小米17 Ultra、小米首款NAS本月登场  谷歌google账号怎么注册账号 谷歌账号注册官方流程  抖音创作助手登录入口_抖音创作辅助工具官网直达  jQuery Mask 插件中实现电话号码固定前导零的教程  sublime如何处理大型CSV文件的列对齐_sublime高级表格编辑插件指南  韩剧圈正版入口页面_韩剧圈官网登录链接  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  J*aScript中高效清空DOM列表元素:解决for循环中断与任务管理问题  J*aScript:在map操作中高效处理空数组  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  必由学官方网站入口 必由学学生教师共用登录通道  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  从J*aScript对象中精确提取指定属性的教程  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  印象笔记如何设离线包出差查阅_印象笔记设离线包出差查阅【离线阅读】 

搜索