C# 9 新特性 —— 增强的模式匹配

C# 9 新特性 —— 增强的模式匹配

Intro

C# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧

Sample

C# 9 中增强了模式匹配的用法,增加了 and/or/not 操作符,而且可以直接判断属性,来看一下下面的这个示例:

var person = new Person();// or
// string.IsNullOrEmpty(person.Description)
if (person.Description is null or { Length: 0 })
{Console.WriteLine($"{nameof(person.Description)} is IsNullOrEmpty");
}// and
// !string.IsNullOrEmpty(person.Name)
if (person.Name is not null and { Length: > 0 })
{if (person.Name[0] is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.'){}
}// not
if (person.Name is not null)
{
}

这里的代码使用 DnSpy 反编译之后的代码是下面这样的:

Person person = new Person();
string text = person.Description;
bool flag = text == null || text.Length == 0;
if (flag)
{Console.WriteLine("Description is IsNullOrEmpty");
}
text = person.Name;
bool flag2 = text != null && text.Length > 0;
if (flag2)
{char c = person.Name[0];if (c >= 'a'){if (c > 'z'){goto IL_8B;}}else if (c >= 'A'){if (c > 'Z'){goto IL_8B;}}else if (c != ',' && c != '.'){goto IL_8B;}bool flag3 = true;goto IL_8E;IL_8B:flag3 = false;IL_8E:bool flag4 = flag3;if (flag4){}
}
bool flag5 = person.Name != null;
if (flag5)
{
}

Switch

这不仅适用于 is 也可以在 switch 中使用

switch (person.Age)
{case >= 0 and <= 3:Console.WriteLine("baby");break;case > 3 and < 14:Console.WriteLine("child");break;case > 14 and < 22:Console.WriteLine("youth");break;case > 22 and < 60:Console.WriteLine("Adult");break;case >= 60 and <= 500:Console.WriteLine("Old man");break;case > 500:Console.WriteLine("monster");break;
}

反编译后的代码:

int age = person.Age;
int num = age;
if (num < 22)
{if (num < 14){if (num >= 0){if (num > 3){Console.WriteLine("child");}else{Console.WriteLine("baby");}}}else if (num > 14){Console.WriteLine("youth");}
}
else if (num < 60)
{if (num > 22){Console.WriteLine("Adult");}
}
else if (num > 500)
{Console.WriteLine("monster");
}
else
{Console.WriteLine("Old man");
}

More

可以看到有些情况下可以简化不少代码,尤其是 if 分支比较多的情况下使用上面 switch 这样的写法会清晰很多

但是如果只是 string.IsNullOrEmpty 这种代码最好还是不要写得这么骚了,小心要被同事吐槽了

炫技需谨慎,小心被 ...

Reference

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Sample

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/PatternMatchingSample.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arma3自定义服务器,Arma3 生存服架设教程,武装突袭3游戏服务器架设

Arma3 生存服架设教程&#xff0c;武装突袭3游戏服务器架设此教程仅适用于Windows系统&#xff0c;独立服务器或者家用电脑都可以用本教程简单搭设Exile Mod。开服其实很简单, 只要你有足够的耐心&#xff01;1.首先 在你的服务器上打开steam下载ArmA 3 Server (SteamCMD 则使用…

netcore读取json文件_【NET Core】.NET Core中读取json配置文件

在.NET Framework框架下应用配置内容一般都是写在Web.config或者App.config文件中&#xff0c;读取这两个配置文件只需要引用System.Configuration程序集&#xff0c;分别用System.Configuration.ConfigurationManager.AppSettings["SystemName"];//读取appSettings配…

前端数据层落地实践

源宝导读&#xff1a;天际移动平台经过重构改版&#xff0c;近期正式发布了1.0版本&#xff0c;我们在低代码开发方面做了进一步增强。本文主要围绕前端Model、前端业务逻辑(领域模型)、数据层与视图层解耦(包装器模式)3个方面&#xff0c;给大家分享一下统一数据层方案的设计思…

计算机内存条只认了一个,怎么解决Win10插入2个4G内存条却只显示4G?

为了提高 Win10系统 的运行速度&#xff0c;有用户在自己的电脑中&#xff0c;插入了2根4G内存&#xff0c;可是发现电脑只能显示4G而不是8G&#xff0c;奇怪的是使用卤蛋师却可以检测到8G内存&#xff0c;这是怎么回事呢&#xff1f;我们该如何解决呢&#xff1f;下面&#xf…

scanf 返回值_scanf函数

一、函数scanf()是C语言中的一个输入函数。与printf函数一样&#xff0c;都被声明在头文件stdio.h里&#xff0c;因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数&#xff0c;即按用户指定的格式从键盘上把数据输入到指定的变量之中。函数的原型为&…

【Git】Git-常用命令备忘录(三)

git作为一个vcs&#xff08;version control system&#xff09;&#xff0c;是越用越香&#xff0c;那么还有哪些比较香的地方呢&#xff01;&#xff1f;1.远程仓库中拉取指定分支一定遇到这种情况&#xff0c;github看到一个心仪的开源仓库&#xff0c;但是分支太多&#xf…

jenkins换服务器找不到包,服务器重启后Jenkins项目部分丢失问题解决方法

UVALive 4670 Dominating Patterns --AC自动机第一题题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include #include phpMyAdmin - 错误 您应升级到 MySQL 5&period;5&period;0 或更高版本&comma;解决办法。…

mysql表类型_MySQL表类型的选择

P131)创建表时的默认引擎是InnoDB&#xff0c;如果要修改默认的存储引擎&#xff0c;可以在参数文件中设置default-table-type。查看当前的默认存储引擎&#xff0c;可以使用一下命令&#xff1a;创建新表的时候可以通过增加ENGINE关键字设置新建表的存储引擎。也可以通过ALTER…

计算机怎么取消脱敏设置,一种敏感数据自适应的脱敏方法、系统技术方案

【技术实现步骤摘要】一种敏感数据自适应的脱敏方法、系统本专利技术涉及计算机技术与信息安全领域&#xff0c;并且更具体地&#xff0c;涉及一种敏感数据自适应的脱敏方法、系统。技术介绍随着数据时代的到来&#xff0c;数据中蕴藏的巨大价值得以挖掘&#xff0c;同时也带来…

ASP.NET Core Controller与IOC的羁绊

前言看到标题可能大家会有所疑问Controller和IOC能有啥羁绊&#xff0c;但是我还是拒绝当一个标题党的。相信有很大一部分人已经知道了这么一个结论&#xff0c;默认情况下ASP.NET Core的Controller并不会托管到IOC容器中&#xff0c;注意关键字我说的是"默认"&#…

win10 mysql my.cnf_MySQL配置文件无法修改的解决方法(Win10)

帮别人解决的问题&#xff0c;记录一下。问题描述MySQL的版本是5.7&#xff0c;操作系统是window10。MySQL安装在 C:\Program Files 下。最近需要在MySQL安装目录下的 my-default.ini 配置文件里面加上一个新的配置项&#xff1a;max_allowed_packet100M编辑文件后保存&#xf…

服务器机房 维护,服务器机房建设与管理维护.pdf

服务器服务器机房机房建设与管理维护建设与管理维护服务器服务器机房机房建设与管理维护建设与管理维护电子科技大学信息中心目录服务器机房的设计和建设服务器机房的设计和建设服务器机房的运行维护和管理服务器机房的设计与建设一、机房对信息化的发展的重要性二、计算机…

引入Jaeger——扩展

Jaeger是收集全链路跟踪的信息&#xff0c;在Jaeger收集的信息中&#xff0c;有请求的url信息&#xff0c;有每个请求的时间间隔&#xff0c;借助这些信息可以进行报警&#xff0c;比如一次较长的请求&#xff0c;或者是某些请求的次数和先后等。不管报警的业务规则是什么&…

mysql 操作类 C .net_.NET MYSQL数据库操作基类( C#源码)

使用MySql.Data.dll&#xff0c;它.Net访问MySQL数据库的一个驱动  下载DbHelperMySql.CSusing System;using System.Collections;using System.Collections.Specialized;using System.Data;using System.Data.SqlClient;using System.Configuration;using MySql.Data.Types;…

判断 服务器架构性能 数据,服务器架构之性能扩展-第五章(6)

Mysql>create table t2 like t1;//复制表结构Mysql>insert into t2 select * from t1; //复制数据内容索引是一种快速查询的有效方法&#xff0c;可以通过alter增加索引或create语句创建。mysql>alter table t1 add ind_id (id);mysql>alter table t1 add unique/p…

微服务畅想录

关于微服务的文章&#xff0c;网络上很多&#xff0c;也比较专业。下面&#xff0c;我尝试着用简单的话写点自己对微服务的理解&#xff0c;非常接地气&#xff0c;但只是一家之言&#xff0c;大家还是带着辩证的眼光来读。1、微服务的本质是什么&#xff1f;微服务的本质是&am…

mysql sql 检测磁盘_MySQL 数据库磁盘占用情况查询

查询所有数据库占用磁盘空间大小的SQL语句&#xff1a;select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2), MB) as data_size,concat(truncate(sum(index_length)/1024/1024,2),MB) as index_sizefrom information_schema.tablesgroup by TABLE_SCHEMAorder…

anjularjs ajax 调用,AngularJS AJAX调用的服务(AngularJS Ajax Call in Service

我想我的应用程序&#xff0c;使AJAX调用一个RESTful Web服务。 在我的html文件是连接到一个范围对象两个文本框。 这两个领域都连接到通过NG-变“后”功能。 post方法发送“形式”变量从范围的API和web服务增加了两个数字&#xff0c;并用JSON文件&#xff0c;该文件现在包含的…

如何在 ASP.NET Core 中 使用 功能开关

.NET Core 中的 功能管理 (Feature Management) 包可用于实现 功能开关&#xff0c;什么意思呢&#xff1f;就是可以通过 功能开关 特性动态的改变应用程序的行为而不需要改变任何的业务逻辑代码&#xff0c;听起来是不是挺有意思&#xff0c;本篇我们就来讨论如何使用这个包。…

存储mysql数据存在特殊字符时处理_SQL数据库对于保存特殊字符的解决办法

数据库的Char、Vachar类型可以兼容汉字&#xff0c;但特殊字符不行&#xff0c;在保存包含有特殊字符的字符串、正文时&#xff0c;会将特殊符号替换成一个”?”号。例如&#xff1a; “基础教育课程手机报•特刊” 》 “基础教育课程手机报?特刊”解决办法是将字段改成NCha…