增强的模式匹配

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的更多相关文章

  1. C#9.0 终于来了,带你一起解读Pattern matching 和 nint 两大新特性玩法

    一:背景 1. 讲故事 上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多 ...

  2. 【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 要安装 ...

  3. pattern matching is C# 7.0

    https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is 原来的版本 private static s ...

  4. scala pattern matching

    scala语言的一大重要特性之一就是模式匹配.在我看来,这个怎么看都很像java语言中的switch语句,但是,这个仅仅只是像(因为有case关键字),他们毕竟是不同的东西,switch在java中, ...

  5. Beginning Scala study note(5) Pattern Matching

    The basic functional cornerstones of Scala: immutable data types, passing of functions as parameters ...

  6. Zhu-Takaoka Two-dimensional Pattern Matching

    Two dimensional pattern matching. Details may be added later.... Corresponding more work can be foun ...

  7. [Scala] Pattern Matching(模式匹配)

    Scala中的match, 比起以往使用的switch-case有著更強大的功能, 1. 傳統方法 def toYesOrNo(choice: Int): String = choice match ...

  8. Webx.0-Web2.0:Web2.0

    ylbtech-Webx.0-Web2.0:Web2.0 Web2.0 是相对于Web1.0 的新的时代.指的是一个利用Web的平台,由用户主导而生成的内容互联网产品模式,为了区别传统由网站雇员主导生 ...

  9. Symbols of String Pattern Matching

    Symbols of String Pattern Matching in Introduction to Algorithms. As it's important to be clear when ...

  10. Android安全升级的7.0: Nougat

    Tamic http://www.jianshu.com/users/3bbb1ddf4fd5/latest_articles 今年夏天以来,Google做了多种增强的安全性在Android的7.0N ...

随机推荐

  1. Android 应用接入 Firebase Crashlytics 进行崩溃分析上报

    前言 所在公司的项目中有一款应用应客户要求,需要接入 Firebase Crashlytics,在此提前练手,也做个总结.本文以最新的 Gradle 7.5 为例,如果 Gradle 版本比较低,添加 ...

  2. 记一次逆向分析解密还原Class文件

    前言 前阵子我的一位朋友发来一份代码让我帮忙看看.具体就是所有的jsp文件内容和大小都一样,漏洞挖掘无从下手.经过分析发现所有的Class都使用了自定义的加密工具加密,经过逆向分析,顺利解密,因而有了 ...

  3. NodeJS连接mysql,报错ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

    我是mysql8.0以上的版本,在用NodeJS连接服务器中mysql数据库时开始报错 这表示服务器启动起来,但是数据库中密码协议出错,我从网上查到的结果告诉我,是mysql8.0支持了一个新的密码协 ...

  4. [洛谷P5368] [PKUSC2018] 真实排名

    [PKUSC2018]真实排名 题目描述 小 C 是某知名比赛的组织者,该比赛一共有 \(n\) 名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他的选手的数量(包括他自己) ...

  5. MybatisPlus条件查询方法全解

    1.是什么? MybatisPlus通过条件构造器可以组装复杂的查询条件,写一些复杂的SQL语句,从而简化我们的开发提升我们的开发效率 # 可以简单的理解为就是我们写SQL语句时where后面的条件 ...

  6. Docker容器运行、使用、管理

    docker container [COMMAND] 命令: **exec 在容器中执行命令** export 将容器的文件系统导出为tar归档文件(和docker save的区别在于,save会记录 ...

  7. 数字孪生融合GIS系统能够为物流行业提供什么解决方案?

    全球贸易和电子商务的不断发展,让物流行业面临着越来越多的挑战.其中,提高运输效率.降低成本.优化供应链和增强可持续性等问题成为业界关注的焦点.在这个数字化时代,数字孪生和GIS系统的融合为物流行业带来 ...

  8. 98秒转录2.5小时音频,最强音频翻译神器IFW下载部署

    IFW是一款功能强大的音频翻译工具,具备高速转录能力,能在短时间内完成大量音频处理,提高工作效率 以下是IFW在 Nvidia A100 - 80GB 上运行的一些基准测试: 最新中文版:https: ...

  9. Ubuntu 命令使用方法

    apt-get 用作于deb包 yum作用于tar包(也可以运作于rpm包) 首先用yum list wget检查一下你的虚拟机有没有安装wget,如果安装了下面图中会显示 @dvd ,我的没有安装所 ...

  10. 在 Walrus 上轻松集成 OpenTofu

    OpenTofu 是什么? OpenTofu 是一个开源的基础设施即代码(IaC)框架,被提出作为 Terraform 的替代方案,并由 Linux 基金会管理.OpenTofu 的问世为应对 Has ...