C#9.0:Improved Pattern Matching
增强的模式匹配
C#9.0添加了几种新的模式。我们可以参阅模式匹配教程 ,来了解下面代码的上下文:
1 public static decimal CalculateToll(object vehicle) =>
2 vehicle switch
3 {
4 ...
5
6 DeliveryTruck t when t.GrossWeightClass > 5000 => 10.00m + 5.00m,
7 DeliveryTruck t when t.GrossWeightClass < 3000 => 10.00m - 2.00m,
8 DeliveryTruck _ => 10.00m,
9
10 _ => throw new ArgumentException("Not a known vehicle type", nameof(vehicle))
11 };
1、简单类型模式(Simple type patterns)
当前,进行类型匹配的时候,一个类型模式需要声明一个标识符——即使这标识符是一个弃元_,像上面代码中的DeliveryTruck_ 。但是在C#9.0中,你可以只写类型,如下所示:
1 DeliveryTruck => 10.00m,
2、关系模式(Relational patterns)
C#9.0 提出了关系运算符<,<=等对应的模式。所以你现在可以将上面模式中的DeliveryTruck部分写成一个嵌套的switch表达式:
1 DeliveryTruck t when t.GrossWeightClass switch
2 {
3 > 5000 => 10.00m + 5.00m,
4 < 3000 => 10.00m - 2.00m,
5 _ => 10.00m,
6 },
这里 > 5000 和 < 3000就是关系模式。
3、逻辑模式(Logical patterns)
最后,你可以用逻辑操作符and,or 和not将模式进行组合,这里的操作符用单词来表示,是为了避免与表达式操作符引起混淆。例如,上面嵌套的的switch示例,可以按照如下升序排序:
1 DeliveryTruck t when t.GrossWeightClass switch
2 {
3 < 3000 => 10.00m - 2.00m,
4 >= 3000 and <= 5000 => 10.00m,
5 > 5000 => 10.00m + 5.00m,
6 },
此例中间的分支使用了and 来组合两个关系模式来形成了一个表达区间的模式。
not模式的常见的使用是将它用在null常量模式上,如not null。例如我们要根据是否为空来把一个未知分支的处理进行拆分:
1 not null => throw new ArgumentException($"Not a known vehicle type: {vehicle}", nameof(vehicle)),
2 null => throw new ArgumentNullException(nameof(vehicle))
此外,not 在 if 条件中包含 is 表达式时将会很方便,可以取代笨拙的双括号,例如:
if (!(e is Customer)) { ... }
你可以写成:
if (e is not Customer) { ... }
实际上,在is not表达式里,允许你给Customer指定名称,以便后续使用。
1 if (e is not Customer c) { throw ... } // 如果这个分支抛出异常或者返回...
2 var n = c.FirstName; // ... 这里,c肯定已经被赋值了,不会为空
C#9.0:Improved Pattern Matching的更多相关文章
- C#9.0 终于来了,带你一起解读Pattern matching 和 nint 两大新特性玩法
一:背景 1. 讲故事 上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多 ...
- 【python】python安装tensorflow报错:python No matching distribution found for tensorflow==1.12.0
python安装tensorflow报错:python No matching distribution found for tensorflow==1.12.0 python版本是3.7.2 要安装 ...
- pattern matching is C# 7.0
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is 原来的版本 private static s ...
- scala pattern matching
scala语言的一大重要特性之一就是模式匹配.在我看来,这个怎么看都很像java语言中的switch语句,但是,这个仅仅只是像(因为有case关键字),他们毕竟是不同的东西,switch在java中, ...
- Beginning Scala study note(5) Pattern Matching
The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...
- Zhu-Takaoka Two-dimensional Pattern Matching
Two dimensional pattern matching. Details may be added later.... Corresponding more work can be foun ...
- [Scala] Pattern Matching(模式匹配)
Scala中的match, 比起以往使用的switch-case有著更強大的功能, 1. 傳統方法 def toYesOrNo(choice: Int): String = choice match ...
- Webx.0-Web2.0:Web2.0
ylbtech-Webx.0-Web2.0:Web2.0 Web2.0 是相对于Web1.0 的新的时代.指的是一个利用Web的平台,由用户主导而生成的内容互联网产品模式,为了区别传统由网站雇员主导生 ...
- Symbols of String Pattern Matching
Symbols of String Pattern Matching in Introduction to Algorithms. As it's important to be clear when ...
- Android安全升级的7.0: Nougat
Tamic http://www.jianshu.com/users/3bbb1ddf4fd5/latest_articles 今年夏天以来,Google做了多种增强的安全性在Android的7.0N ...
随机推荐
- Nginx自定义日志中时间格式
背景 工作需要对接内部的日志中台,对日志打印有固定的格式要求,为了使Nginx的access日志也能被采集,需要对日志格式进行自定义,要求日志格式为: yyyy-MM-dd HH:mm:ss.SSS ...
- 一款实用的.NET Core加密解密工具类库
前言 在我们日常开发工作中,为了数据安全问题对数据加密.解密是必不可少的.加密方式有很多种如常见的AES,RSA,MD5,SAH1,SAH256,DES等,这时候假如我们有一个封装的对应加密解密工具类 ...
- 【Javaweb】servlet二
servlet程序常见错误 1.url-pattern路径没有以 / 打头 2.servlet-name配置的值不存在 3.servlet-class标签的全类名配置错误 servlet-url地址如 ...
- IDEA的两个实用插件“汉化”和“翻译”
1.汉化包插件 Chinese (Simplified) Language Pack EAP 2.翻译插件 translation 3.效果图 这两个不局限这一软件,IntelliJ这一公司旗下都可以 ...
- 一个ssh无法远程登录的问题跟踪解决
用户反馈龙芯服务器系统loongnix-server使用root用户ssh远程登录,有时候可以有时候又无法登录,频繁出现错误:Permission denied,please try again.我分 ...
- MinIO客户端之mb
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc mb MinIO对象锁定 桶版本控制 桶复制 站点复制概述 创建桶bkt1,命令如下: ./mc mb lo ...
- ElasticSearch之Open index API
打开指定的索引. 命令样例如下: curl -X POST "https://localhost:9200/testindex_003/_open?pretty" --cacert ...
- Asp .Net Core系列:基于MySQL的DBHelper帮助类和SQL Server的DBHelper帮助类
目录 MySQLDBHelper MSSQLDBHelper MySQLDBHelper app.config中添加配置 <connectionStrings> <add name= ...
- Mybatis源码5 StatementHandler ,ParameterHandler
Mybatis5 StatementHandler ,ParameterHandler 一丶概述 前面我们总结了SqlSession--->CachingExecutor--->BaseE ...
- 【Solve】InnerClass annotations are missing corresponding EnclosingMember annotations. Such InnerClass annotations are ignored
问题: 今天Android项目在build时出现了下面的警告: InnerClass annotations are missing corresponding EnclosingMember ann ...