C#8 的模式匹配实现

 更新时间:2019年12月23日 10:37:02   作者:solenovex  
这篇文章主要介绍了C#8 的模式匹配实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#中数据类型的转换介绍

    C#中数据类型的转换介绍

    大家好,本篇文章主要讲的是C#中数据类型的转换介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • C# 二进制序列化和反序列化的具体实现

    C# 二进制序列化和反序列化的具体实现

    本文主要介绍了C# 二进制序列化和反序列化的具体实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码

    c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码

    c#中的浮点型转整形的舍取 四舍五入和银行家舍入实现代码,学习c#的朋友可以参考下
    2012-03-03
  • UGUI ScrollRect实现带按钮翻页支持拖拽

    UGUI ScrollRect实现带按钮翻页支持拖拽

    这篇文章主要为大家详细介绍了UGUI ScrollRect实现带按钮翻页支持拖拽,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C#反射内存的处理分析

    C#反射内存的处理分析

    这篇文章主要介绍了C#反射内存的处理,较为详细的分析了反射加载的内存释放问题,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • RSA密钥--JAVA和C#的区别及联系

    RSA密钥--JAVA和C#的区别及联系

    这篇文章主要介绍了关于RSA密钥事件JAVA和C#的区别及联系,文章从RSA语法介绍开始展开详细介绍了C#转JAVA及JAVA转C#,需要的小伙伴可以可以参考一下
    2021-10-10
  • C#运行程序时阻止关闭显示器和系统待机

    C#运行程序时阻止关闭显示器和系统待机

    这篇文章介绍了C#运行程序时阻止关闭显示器和系统待机的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • c# 基于任务的异步编程模式(TAP)

    c# 基于任务的异步编程模式(TAP)

    这篇文章主要介绍了c# 基于任务的异步编程模式(TAP)的相关资料,帮助大家更好的理解和学习c# 异步编程的相关知识,感兴趣的朋友可以了解下
    2020-11-11
  • C# VB.NET 实现在Word中嵌入多媒体(视频、音频)文件

    C# VB.NET 实现在Word中嵌入多媒体(视频、音频)文件

    Word中可将Office、PDF、txt等文件作为OLE对象插入到文档中,双击该对象可直接访问或编辑该文件,除了以上常见的文件格式对象,也可以插入多媒体文件,如视频、音频等。本篇文章介绍了通过C#实现在Word中插入多媒体文件。感兴趣的可以学习一下
    2021-12-12
  • 浅谈C#中的常量、类型推断和作用域

    浅谈C#中的常量、类型推断和作用域

    这篇文章主要介绍了C#中的常量、类型推断和作用域,有需要的朋友可以参考一下
    2013-12-12

最新评论