C# 7 里面的Pattern Mathing

is 模式

switch 和 when

C# 8 里面的Pattern Matching

使用Deconstructor 和 位置匹配模式

下面两个类Teacher和Student都由构造函数(Constructor)和Deconstructor:

下面我想写一个方法判断学生是不是5年级并且是学数学的:

这里我们就用到了Student的Deconstructor和位置匹配模式,这里面的下划线叫做“discard”(丢弃),表示我们不会使用它不关心它。

如果代码这样写,那么传进来的任何学生都满足这个匹配。

如果想判断5年纪的学生,我们可以这样写:

还想判断他的老师是否教数学,可以这样写:

注意,这里面调用的都是Deconstructor。

实际上,我们可以把Deconstructor的类型去掉,像这样:

实际上针对这种需求,使用if语句可能更好,更容易维护。但是如果循环嵌套的情况下无法使用if,那么这种位置模式匹配就有用了。

属性匹配模式

位置匹配模式很强大,但是可阅读性太差,下面看看属性匹配模式。

还是之前的需求:

我想这个一看就明白,不需要解释了吧?

而且这个方法可以写的更通用一些:

参数类型改为object,然后先判断它是不是Student,在判断是否是5年级学数学的。

Swtich 表达式

有三个形状的类,它们的属性各不相同:

下面我要写一个方法,根据不同的形状,显式相应的信息。这里我会使用C# 8 的 switch表达式。

先从最简单的只有一种情况开始:

方法参数的类型是object,然后使用C# 8的switch表达式,该表达式有返回值,所以可以把返回值放到变量里面然后返回。

可以看到,switch表达式里面没有case 关键字,这里使用的是lambda表达式。

这句话的意思就是,如果shape是Rectangle类型的,那么我们可以通过r这个变量来访问它,右侧的字符串就是这个case表达式的值,这里的返回值就是一个字符串。

把三个形状都写上,就是这样:

注意,这里没有break或者return。并且switch表达式不支持“接盘”(fall through)。

那么默认情况怎么添加呢?这里我们使用discard匹配模式:

这里我们还可以使用属性匹配模式来设置过滤条件:

使用嵌套的switch表达式,也可以达到同样的目的:

最后我们可以让整个方法更简化一点,使用expression-bodied方法:

但还是不要过度使用这种嵌套的模式,毕竟人类还需要阅读你的代码。。。

元组匹配模式

先定义一个枚举:

然后写一个方法,传进两个颜色,得到混合后的颜色:

这里面用的就是元组匹配模式。

最下面还判断了两种颜色都一样的情况,以及其它所有情况。

C# 8 的模式匹配的更多相关文章

  1. XSL学习笔记4 XSLT模式匹配的语法

    模板规则通过使用模式来匹配文档树的节点.模式指定一组条件,用于选择要处理的节点.   模式匹配的语法不光可以在<xsl:template>元素的match属性中使用,还可以在<xsl ...

  2. 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

    之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...

  3. Redis模式匹配删除key

    Redis keys命令支持模式匹配,但是del命令不支持模式匹配,有时候需要根据一定的模式来模糊删除key,这时只能结合shell命令来完成了. 具体命令是: redis-cli KEYS &quo ...

  4. php glob()函数实现目录文件遍历与寻找与模式匹配的文件路径

    采用PHP函数glob实现寻找与模式匹配的文件路径,主要讨论glob()函数的作用和用法,利用glob函数读取目录比其它的要快N倍,因为glob函数是内置函数处理起来自然要快. 一,函数原型 arra ...

  5. Scala的模式匹配

    1.概述 2.程序示例(普通的示例) 3.模式匹配(Array) 4.程序示例(Array) 5.模式匹配(List) 6.程序示例 7.遍历 8.模式匹配(case class) 9.程序示例(传统 ...

  6. 求子串-KPM模式匹配-NFA/DFA

    求子串 数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现 数据结构中串的模式匹配 KPM模式匹配算法 基本的模式匹配算法 //求字串subStrin ...

  7. Oracle 12c 的新功能:模式匹配查询

    模式匹配SQL 在一系列的数据行中辨识出某种模式是一种广泛需求的功能,但在以前的SQL中是不可能的.有许多解决方法,但这些都很难写,很难理解,而且执行效率低下.在Oracle数据库中,从12c开始,你 ...

  8. 【模式匹配】KMP算法的来龙去脉

    1. 引言 字符串匹配是极为常见的一种模式匹配.简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串.特别地,定义主串为\(T[0 \dots n-1]\),模 ...

  9. JavaScript学习笔记-用于模式匹配的String方法

    用于模式匹配的String方法:   String支持4种使用正则表达式的方法:           seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的子串的位置,找不到则返回-1,如 ...

  10. 浅析正则表达式模式匹配的String方法

    在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace.match.search等方法,以下是对一些方法使用的总结. Stri ...

随机推荐

  1. yzoj P2343 & 洛谷 P1437 [HNOI2004]敲砖块

    题意 在一个凹槽中放置了N层砖块,最上面的一层油N块砖,从上到下每层一次减少一块砖.每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如图所示. 如果你想敲掉第i层的第j块砖的话,若i=1,你可以直接 ...

  2. 第二章(Kotlin基础)

    基本要素:函数和变量 函数 函数定义规则 函数通过关键字 fun 用来声明一个函数 参数的类型与函数返回类型写在它的名称后面,这和变量声明一样 函数可以定义在文件的最外层,不一定要把它放在类中 示例: ...

  3. 全网最实用的 Debug调试技巧汇总-Python大佬偷偷使用的神技

    一.思考❓❔ 1.什么是debug? 找茬 找软件的茬 发现程序的缺陷 2.为什么需要debug? 谁都不敢保证,写的代码没有任何问题 高效查找软件异常 一位优秀的开发工程师 20%的时间写代码 80 ...

  4. 微信小程序点击控制元素的显示与隐藏

    微信小程序点击控制元素的显示与隐藏 首先我们先来看一下单个点击效果 我们来看一下wxml中的代码: <view class="conten"> <view cla ...

  5. 无法安装64位office,因为您的PC上有32位

    场景:安装visio2013时,突然报以下错误 解决方案: 1. 单击开始--所有程序--附件--运行,在运行输入“regedit“ 2. 弹出注册表编辑器窗口,选择HKEY_CLASSES_ROOT ...

  6. Winform中设置Dialog的显示位置居中

    场景 点击按钮使窗体以Dialog的方式显示,即弹窗. //声明窗体对象 ChartOption chartOption = new ChartOption(); //显示Dialog chartOp ...

  7. Winform中使用zxing和Graphics实现自定义绘制二维码布局

    场景 zxing.dll下载 https://download.csdn.net/download/badao_liumang_qizhi/11623214 效果 实现 根据上面文章中将简单的二维码生 ...

  8. mysql命令行乱码解决办法

     解决办法: 修改mysql的配置文件my.ini,打开my.ini找到default-charactor-set,改为utf8. 进入命令行: show variables like'%char%' ...

  9. CentOS 7.6安装MySQL 5.7GA版

    环境准备 卸载mariadb rpm -qa | grep mariadb rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64 centos7 内部集 ...

  10. java8 新特性精心整理

    前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特 ...