C#8 的模式匹配实现
作者:solenovex 发布时间:2023-02-11 16:22:16
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
来源:https://www.cnblogs.com/cgzl/p/11673661.html


猜你喜欢
- C#事件实例详解C#和JAVA有许多相似的地方,设计思想差不多,语法及其相像,均传承自面向对象设计思想,灵感来自C++并取其精华去其“糟粕(
- 前言:来这家公司上班后,开始使用Git作为项目版本控制系统,由于以前用的是SVN,所以对Git也就简单学习了一下。但是,实践出真知,当开始使
- 在作应用系统开发时,管理配置是必不可少的。例如数据库服务器的配置、安装和更新配置等等。由于Xml的兴起,现在的配置文件大都是以xml文档来存
- 在拼接绝对路径的网址时,经常需要从Request.Url中获取根网址(比如https://git.oschina.net),然后与相对路径一
- JAVA可以通过反射获取成员变量和静态变量的名称,局部变量就不太可能拿到了。public class Test {public static
- 前言已经有两个月没有更新博客了,其实这篇文章我早在两个月前就写好了,一直保存在草稿箱里没有发布出来。原因是有一些原理性的东西还没了解清楚,最
- Android 双击返回键退出程序的方法总结下面先说说LZ思路,具体如下: 1. 第一种就是根据用户点击俩次的时间间隔去判断是否退出程序;
- 前言一说到Socket,想必大家都或多或少有所涉及,从最初的计算机网络课程,讲述了tcp协议,而Socket就是对协议的进一步封装,使我们开
- 效果展示如下所示:实时监控redis环境信息和日志列表Redis配置在windows下安装的redis,在安装目录找到redis.windo
- 客户端import java.io.BufferedReader;import java.io.InputStreamReader;impo
- Java面向对象编程之多态一.对于多态的理解:通俗点理解,多态其实就是一词多义,就是一种方法的多种状态,即不同的类对象,调用同一个方法名,有
- 统计输入的行数标准库保证输入文本流以行序列的形式出现,每一行均以换行符结束。因此,统计行数等价于统计换行符的个数。#include <
- static关键字在Java中,static是静态修饰关键字。用于修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性
- 使用淘宝ip地址库的api查询ip地址信息。TaobaoIPHelper.csusing System;using System.Coll
- 某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干
- 改进思考正常实现流程应该为继承ClassLoader虚拟类,并重写其loadClass方法和findClass方法,并在loadClass方
- 本文实例为大家分享了java生成验证码图片的具体代码,供大家参考,具体内容如下示例一:import org.apache.commons.c
- 测试代码pom.xml:<?xml version="1.0" encoding="UTF-8"
- 前言对象关系映射(ORM)已经被使用了很长时间,以解决在编程过程中对象模型与数据模型在关系数据库中不匹配的问题。Dapper是由Stack
- 方法一:效果如下图所示:代码如下:using System;using System.Collections.Generic;using S