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 ...
随机推荐
- 暴力+分治+贪心+DP:最大子序列和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 ...
- 使用OSS搭建私有云内网yum仓库的方法
版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 使用OSS搭建私有云内网yum仓库的方法 文字&图片内容已脱敏 #.前几天接到一个搭建内网yum源的任务.刚接 ...
- 数据分析师如何做好PPT
作为一名数据分析师,制作出色的PPT是非常重要的技能之一.一个好的PPT可以让你的数据洞察更加生动有趣,并有效传达给观众.以下是一些详细的步骤和技巧,帮助你成为一名擅长制作PPT的数据分析师: 确定目 ...
- [NewStarCTF WEEK5] pwn-planet 详解
这道题目更多是考pwner的逆向功底(虽然程序逻辑也不是非常复杂=_=) 老规矩,先checksec查看程序 保护全开 看一下main函数 __int64 __fastcall main(int a1 ...
- AR9271无线网卡Win10配置热点
AR9271无线网卡Win10配置热点 需要的无线网卡如下图 1 准备工作 网卡参数 Atheros AR9271是一款高性能的无网络模块,采用802.11b/g/n标准,支持2.4GH频段.它被广泛 ...
- [ABC268G] Random Student ID
Problem Statement Takahashi Elementary School has $N$ new students. For $i = 1, 2, \ldots, N$, the n ...
- 【scikit-learn基础】--『预处理』之 数据缩放
数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...
- ngnix学习-反向代理
代理:可以理解为中间商,用来帮助事物A和事物B建立连接的桥梁. 什么是反向代理呢,其实就是反过来,反客为主大家都知道吧. 说明: 这里稍微罗嗦一下.做一个说明. 正常情况下,你是需要干什么,才去干什么 ...
- HTB - CozyHosting - WriteUp
CozyHosting 前言:抓紧赛季末上一波分,错过开vip才能练了 信息收集 扫描看看端口的开放情况,开了22,80,5555.这里fscan显示会跳转到cozyhosting.htb. 那就需要 ...
- 【scikit-learn基础】--『监督学习』之 逻辑回归分类
逻辑回归这个算法的名称有一定的误导性.虽然它的名称中有"回归",当它在机器学习中不是回归算法,而是分类算法.因为采用了与回归类似的思想来解决分类问题,所以它的名称才会是逻辑回归. ...