C# 使用模式匹配的好处,因为好用所以推荐~
类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。
复杂条件逻辑:在处理复杂的条件逻辑时,特别是涉及到多个条件和类型的情况下,使用模式匹配可以使代码更加清晰易读。通过模式匹配,可以将复杂的if-else链或switch语句简化,使逻辑更直观。
解构复合类型:当你需要从复合类型(如元组、自定义类等)中提取值时,模式匹配允许你直接在条件检查中进行解构,这样可以避免编写额外的解构代码,使得代码更加简洁。
范围检查:对于需要进行范围检查的场景,如检查一个数是否落在某个区间内,使用C# 9.0引入的关系模式可以极大简化代码,使得范围检查逻辑一目了然。
逻辑组合:在需要对多个条件进行逻辑组合的情况下,如需要检查一个值是否满足多个条件之一或全部条件,使用逻辑模式可以直接在模式匹配表达式中使用and、or和not运算符,避免了复杂的逻辑嵌套。
数据验证:模式匹配可以用于数据验证场景,特别是当验证逻辑涉及到类型检查、值范围检查或特定属性值检查时。通过模式匹配,可以在单个表达式中完成所有这些检查,使得验证逻辑更加紧凑和易于维护。
多态行为:在处理需要根据对象类型执行不同操作的多态行为时,模式匹配提供了一种更灵活的方式来替代传统的虚方法或接口实现。这使得在不修改原有类层次结构的情况下,能够更容易地扩展或修改行为。
替代访问者模式:在实现访问者设计模式时,模式匹配可以作为一种更简洁的替代方案,特别是在处理复杂的对象结构时。通过模式匹配,可以直接在一个地方处理所有类型的情况,而不需要为每种类型创建单独的访问者方法。
模式匹配的这些用途展示了它在简化代码、提高可读性和灵活处理不同类型和条件的强大能力。随着C#语言的发展,模式匹配的功能和应用场景将会进一步扩展和深化。
下面我们看下一些经典且好用的模式匹配编码风格:
is断言 变量s已被安全地转换为string类型
object obj = "Hello, World!";
if (obj is string s) {
Console.WriteLine(s);
}
switch 允许使用多种模式,包括类型模式、常量模式和var模式 ,无需我们提前做转换以节省编码量
switch (obj) {
case 0:
Console.WriteLine("Zero");
break;
case var value:
Console.WriteLine($"Value: {value}");
break;
}
C# 8.0引入了属性模式,允许基于对象的属性进行模式匹配
public class Person {
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person { Name = "John", Age = 30 };
//通俗易懂属性模式:如果person不为null,且name==john 并且age>=18的时候
if (person is { Name: "John", Age: >= 18 }) {
Console.WriteLine("John is an adult.");
}
C# 9.0引入的逻辑模式,它允许使用逻辑运算符and、or和not来组合模式。
if (number is > 0 and < 10 or 100) {
Console.WriteLine("Number is between 0 and 10 or equals 100.");
}
元组模式允许你对元组的元素进行模式匹配,这在处理元组返回值或多值情况时非常有用
var numbers = (1, "one", 18);
if (numbers is (1, string name, int age)) {
Console.WriteLine($"The name of 1 is {name}, age {age}!");
}
列表模式允许对数组、列表等集合进行模式匹配,可以匹配集合的长度、元素等属性。这对于处理集合数据时进行模式匹配提供了极大的便利。
int[] numbers = { 1, 2, 3 };
if (numbers is [1, 2, 3]) {
Console.WriteLine("The array contains the numbers 1, 2, and 3 in that order.");
}
切片模式允许你匹配集合的一部分,而不是整个集合。这在你只关心集合的某个特定部分时特别有用。
int[] numbers = { 0, 1, 2, 3, 4 };
if (numbers is [0, .., 4]) {
Console.WriteLine("The array starts with 0 and ends with 4.");
}
当然这里只是介绍了部分好用的模式匹配,随着C#语言的逐代增强,可能会有更多的新特性和改进被引入。
C# 使用模式匹配的好处,因为好用所以推荐~的更多相关文章
- GraphX 图计算实践之模式匹配抽取特定子图
本文首发于 Nebula Graph Community 公众号 前言 Nebula Graph 本身提供了高性能的 OLTP 查询可以较好地实现各种实时的查询场景,同时它也提供了基于 Spark G ...
- Scala进阶之路-面向对象编程之类的成员详解
Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...
- sql server中常用方法函数
SQL SERVER常用函数 1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值. (1)语法: DATEADD ( datepart , number, date ) ...
- MyBatis-3.2.2
note SqlSessionFactory 它是一个线程安全的 SqlSession 线程非安全,不能做类的公用变量 当数据库字段和实体对象名称不一至时,通过sql的字段命名别名,别名跟实体对象属性 ...
- Spark(十二)--性能调优篇
一段程序只能完成功能是没有用的,只能能够稳定.高效率地运行才是生成环境所需要的. 本篇记录了Spark各个角度的调优技巧,以备不时之需. 一.配置参数的方式和观察性能的方式 额...从最基本的开始讲, ...
- CC2530学习路线-基础实验-GPIO 控制LED灯亮灭(1)
目录 1.前期预备知识 1.1 新大陆ZigBee模块LED灯电路 1.2 CC2530相关寄存器 1.3 寄存器操作技巧 1.4 CPU空转延时 1.4 操作流程图 2.程序代码 The End 1 ...
- 总结: 《jQuery基础教程》 1-4章
前言: 因为公司的项目用到了jQuery+Bootstrap,而Bootstrap基于jQuery,突然发现自己只是很久前看过jQuery的视频教程,对jQuery的一些API有一些了解,在使用中还是 ...
- 面试题:Java程序员最常用的20%技术 已看1
首先常用api(String,StringBuffer/StringBuilder等) 1.集合类,线程类 2.Servlet(很少用纯粹的servlet写,但你要懂,因为很多框架都是基于servle ...
- Improving Deep Neural Networks 笔记
1 Practical aspects of Deep Learning 1.1 Train/Dev/Test sets 在小样本的机器学习中,可以分为60/20/20. 在大数据训练中,不需要划分很 ...
- 唯品会Java开发手册》1.0.2版阅读
<唯品会Java开发手册>1.0.2版阅读 1. 概述 <阿里巴巴Java开发手册>,是首个对外公布的企业级Java开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...
随机推荐
- LLM实战:当网页爬虫集成gpt3.5
1. 背景 最近本qiang~关注了一个开源项目Scrapegraph-ai,是关于网页爬虫结合LLM的项目,所以想一探究竟,毕竟当下及未来,LLM终将替代以往的方方面面. 这篇文章主要介绍下该项目, ...
- AIRIOT智慧变电站管理解决方案
随着社会电气化进程的加速,电力需求与日俱增,变电站作为电网的关键节点,其稳定性和智能化管理水平直接关系到整个电力系统的高效运作.传统变电站管理平台难以适应现代电力系统复杂管理需求,存在如下痛点: 数据 ...
- RocketMQ阅读源码前的准备
本文将讲解如何在IDEA中导入 RocketMQ 源码,并运行 Broker 和 NameServer,编写一个消息发送与消息消费的示例. 一. 源码导入及调试 1.1 导入源码 RocketMQ 原 ...
- 腾讯redis2.3集群搭建
环境规划: IP 主机名 组件 配置 备注 192.168.3.81 node1 8核16G 磁盘X2-50G 没有8核16G无法添加服务器 192.168.3.82 node2 cache,prox ...
- Dockerfile PHP镜像制作
1 PHP镜像制作: 1.1 php-dockerfile FROM centos:7 LABEL maintainer www.chenleilei.net RUN yum install -y c ...
- C#中接口的显式实现与隐式实现及其相关应用案例
C#中接口的显式实现与隐式实现 最近在学习演化一款游戏项目框架时候,框架作者巧妙使用接口中方法的显式实现来变相对接口中方法进行"密封",增加实现接口的类访问方法的"成本& ...
- mkfs.xfs报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs: Use the -f option to force overwrite.
在设置逻辑卷文件类型时候报错 mkfs.xfs: /dev/new/new_box appears to contain an existing filesystem (ext4). mkfs.xfs ...
- python安装OCR识别库
(1)安装过程 参考的这个博客:https://blog.csdn.net/lanxianghua/article/details/100516187?depth_1-utm_source=distr ...
- Java中GUI
目录 1.Java GUI 概述 2.容器 2.1 窗口 2.2 弹窗和对话框 对话框 自定义弹窗 2.3 面板 普通面板 滚动面板 分隔面板 选项卡面板 3.布局 3.1.流式布局 3.2.网格布局 ...
- .NET5 IIS ASP.NET CORE 部署时 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure
.NET5 IIS ASP.NET CORE 部署时 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure 部署机器只安装了dotnet-hos ...