时间:2021-05-20
C# 7 里面的Pattern Mathing
更多内容请查看官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8#more-patterns-in-more-places?WT.mc_id=DT-MVP-5003302
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方法:
但还是不要过度使用这种嵌套的模式,毕竟人类还需要阅读你的代码。。。
元组匹配模式
先定义一个枚举:
然后写一个方法,传进两个颜色,得到混合后的颜色:
这里面用的就是元组匹配模式。
最下面还判断了两种颜色都一样的情况,以及其它所有情况。
更详细内容请查看官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8#more-patterns-in-more-places?WT.mc_id=DT-MVP-5003302
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言C#8中新增了一个非常有趣的特性,叫做默认接口方法(又称虚拟扩展方法),这篇文章将会讨论C#8中的默认接口方法以及如何使用。在C#8之前,接口不能包含方法定
Intro有的语言数组的索引值是支持负数的,表示从后向前索引,比如:arr[-1]从C#8开始,C#支持了数组的反向Index,和Range操作,反向Index
C语言数据结构之模式匹配字符串定位问题主要实现了三种字符串的模式匹配,主要包括字符串子操作的集合,字符串指针回溯,和KMP算法头文件#ifndefINDEXHE
C语言数据结构中串的模式匹配串的模式匹配问题:朴素算法与KMP算法#include#includeintIndex(char*S,char*T,intpos){
前言在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。比如下面的例