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开发手册,对整个业界都有重要的意义. 我们结合唯品会的内部经 ...
随机推荐
- 阿里巴巴 MySQL 数据库之建表规约(一)
建表规约 强制部分 [强制] 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint (1 表示是,0 表示否). 说明:任何字段如果为非负数,必须是 ...
- Python爬取数据并保存到csv文件中
1.数据源 2.Python代码 import requests from lxml import etree import csv url = 'http://211.103.175.222:508 ...
- C# xml与对象相互转换
例如: 1.对象转xml(对象序列化为xml) string strImage= XmlSerializeHelper.Serialize<List<ImageSingle>> ...
- 【C#】使用ffmpeg image2pipe将图片保存为mp4视频
文章目录需求实现需求在正式开始之前,先介绍下我的需求是怎么样的,基于此需求如何使用ffmpeg实现.仅供参考. 需求点: 将图片保存为视频图片数量不是固定的,是由上游的webrtc传下的帧数据,转成的 ...
- kubernetes ingress网站发布
ingress网站发布 单域名 # 1.创建nginx pod 名称: nginx-nodeport.yaml cat nginx-nodeport.yaml apiVersion: v1 kind: ...
- NET工控,上位机,Modbus485网口/串口通讯(鸣志步进电机,鸣志伺服电机,松下伺服电机,华庆军继电器模块)
先上两个通用Modbus帮助类,下面这个是多线程不安全版,在多线程多电机同一端口通信下,可能造成步进电机丢步或者输出口无响应等,还有个多线程安全版,只是基于这个不安全版加上了LOCK,THIS usi ...
- C语言打印数字前补0
1.要求说明 例如有个数据为a = 0x10,要求打印输出为0x000010. 2.实现 1 #include <stdio.h> 2 3 4 int main() 5 { 6 int a ...
- jquery的循环 tab切换
<ul> <li>1</li> <li>2</li> <li>3< ...
- 小米 红米 Redmi 屏幕录制默认参数设置
小米 红米 Redmi 屏幕录制默认参数设置 视频画质:16Mbps. 帧数:60fps.
- C#.NET MySql8.0 EF db first
.net framework 4.5.2,winform 程序. mysql 8.0 1.nuget中引用EntityFramework,6.4.4 2.nuget中引用MySql.Data.Enti ...