增强的模式匹配

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. 趋势指标(一)MACD指标

    MACD称为异同移动平均线,是从双指数移动平均线发展而来的,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA) ...

  2. 编程技巧 --- VS如何调试.Net源码

    引言 如题,在VS中如何调试 .Net 源码呢? 一般来说,VS2022,都是默认启用 F12 转到定义能够看到源码,如果大家发现自己无法使用 F12 查看源码,可以在 "工具" ...

  3. SQL 语言标准简介

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 一.简介 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是 ...

  4. keil 4 安装教程

    一.下载 keil 官网 二.安装教程 1.开始安装 双击安装包,开始安装,直接下一步. 2.勾选同意,下一步 3.选择软件安装路径,下一步 4.填写信息 可以随意填写,下一步. 5.等待安装 6.安 ...

  5. Tainted canvases may not be exported,视频帧截图跨域

    做原生相机拍照的时候遇见的有趣问题,视频流是上传到云服务器的在线链接,赋值到video的src上,然后使用canvas的drawImg方法去截取视频帧做照片,结果canvas报错视频跨域. 解决方案: ...

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

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

  7. mysql的begin end嵌套

    这个教程基本很少,因为这个很简单,但又会让(新手)人难以完成这嵌套. 为了方便读者理解,我把不需要嵌套的也嵌套起来了.(就比如下面这几行代码) delimiter $$ drop procedure ...

  8. [THUPC 2023 初赛] 快速 LCM 变换

    题目描述 小 I 今天学习了快速最小公倍数变换(Fast Least-Common-Multiple Transform, FLT),于是他想考考你. 给定一个长度为 \(n\) 的正整数序列 \(r ...

  9. echarts设置多条折线不是你想的那样简单

    简单的多条折线图 小伙伴写过多条折线图的都知道, 常见的折线图是 xAxis 配置项下的 data属性上设置时间或者日期. series配置项下是对应的 legend中的数据以及该条折线的数据. &l ...

  10. Linux磁盘专题

    物理磁盘名次和其作用 盘片:disk 盘片上下都有磁头. 磁盘面: 盘片有上下两面,每一面叫磁盘面 磁头:heads 每个磁头负责一个磁盘面,负责读取数据.将数据写入磁道. 磁头都是固定在机械臂上(机 ...