C#8.0中的模式匹配
作者:天方 发布时间:2023-07-19 13:27:39
标签:C#,模式,匹配
C# 8.0中的模式匹配相对C# 7.0来说有了进一步的增强,对于如下类:
class Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) => (X, Y) = (x, y);
public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}
首先来看C# 7.0中一个经典的模式匹配示例:
static?string?Display(object?o)
{
????switch?(o)
????{
????????case?Point?p?when?p.X?==?0?&&?p.Y?==?0:
????????????return?"origin";
????????case?Point?p:
????????????return?$"({p.X},?{p.Y})";
????????default:
????????????return?"unknown";
????}
}
在C# 8.0中,它有更加精简的写法。
Switch表达式
在C# 8.0中,可以利用新的switch方式成模式匹配:
static?string?Display(object?o)?=>?o?switch
{
????Point?p?when?p.X?==?0?&&?p.Y?==?0?=>?"origin",
????Point?p???????????????????????????=>?$"({p.X},?{p.Y})",
????_?????????????????????????????????=>?"unknown"
};
它利用一条switch语句完成了模式匹配,第一样看上去要简洁一些。不过,它还有更多更简单的写法。
Property patterns
可以直接通过在属性上指定值作为判定条件,
static?string?Display(object?o)?=>?o?switch
{
????Point?{?X:?0,?Y:?0?}?=>?"origin",
????Point?p???????????? =>?$"({p.X},?{p.Y})",
????_?????????????????? =>?"unknown"
};
也可以将属性值传递出来。
static?string?Display(object?o)?=>?o?switch
{
????Point?{?X:?0,?Y:?0?}?????????=>?"origin",
????Point?{?X:?var?x,?Y:?var?y?}?=>?$"({x},?{y})",
????_????????????????????????????=>?"unknown"
};
Positional patterns
利用解构函数,可以写出更加精简的表达式。
static?string?Display(object?o)?=>?o?switch
{
????Point(0,?0)?????????=>?"origin",
????Point(var?x,?var?y)?=>?$"({x},?{y})",
????_???????????????????=>?"unknown"
};
如果没有类型转换,则可以写得更加简单了:
static?string?Display(Point?o)?=>?o?switch
{
????(0,?0)?????????=>?"origin",
????(var?x,?var?y)?=>?$"({x},?{y})"
};
非空判断
如果只是判断空和非空,则有最简单的模式:
{?}??=>?o.ToString(),
null?=>?"null"
Tuple patterns
也支持直接对ValueTuple进行模式匹配,用起来非常灵活。
static?State?ChangeState(State?current,?Transition?transition,?bool?hasKey)?=>
????(current,?transition,?hasKey)?switch
{
????(Opened,?Close,?_)?????=>?Closed,
????(Closed,?Open,??_)?????=>?Opened,
????(Closed,?Lock,?true)???=>?Locked,
????(Locked,?Unlock,?true)?=>?Closed,
????_?=>?throw?new?InvalidOperationException($"Invalid?transition")
};
小结
C# 8.0的模式匹配有了进一步的增强,虽然可以又有人要说是语法糖了,但用得好的话可以让你的代码逻辑简化不少,更加容易理解。
参考文章
Do more with patterns in C# 8.0
来源:https://www.cnblogs.com/TianFang/p/10322434.html


猜你喜欢
- 一、场景Android项目的开发过程中,我们项目中的gradle的dependencies闭包中会引入很多三方依赖库,引入的库越多,越容易产
- MD5,全称为 Message Digest Algorithm 5(消息摘要算法第五版).详情请参考 * :MD5MD5加密后是一个字
- 本文实例讲述了java可变参数当做数组处理的方法.分享给大家供大家参考,具体如下:java可变参数当做数组处理ava1.5增加了新特性:可变
- 最近公司在新版本上有一个需要,要在首页添加一个滑动效果,具体就是仿照X宝的商品详情页,拉到页面底部时有一个粘滞效果,如下图X东的商品详情页,
- 前言可能有人会有疑问,为什么外面已经有更好的组件,为什么还要重复的造轮子,只能说,别人的永远是别人的,自己不去造一下,就只能知其然,而不知其
- 初步计划:或许由于个人原因,排球计分系统在假期就完成了,一直未写博客,就这样一直在推就是不想写,在加上过完年就工作了,可能刚实习工作比较紧所
- 背景SpringBoot bean 加载顺序如何查看,想看加载了哪些bean, 这些bean的加载顺序是什么?实际加载顺序不受控制,但会有一
- 本文实例讲述了Android开发之全屏与非全屏的切换设置方法。分享给大家供大家参考,具体如下:静态方法1. 代码方式在Activity类On
- 本文实例讲述了C#定时关闭窗体的方法,分享给大家供大家参考。具体方法如下:public partial class Form2 : Form
- 前端代码:<form id= "uploadForm"> <p >指定文件名:
- 理解函数式接口以及 Lambda表达式的发展过程任何接口,只包含唯一一个抽象方法,就是函数式接口/** * lambdab表达式的发展 */
- 本文通过实例来介绍如何使用commons-fileupload.jar,Apache的commons-fileupload.jar可方便的实
- 最近由于项目需要把不同格式的视频转换为ts流,故研究了一下ffmpeg。在网上找了很多资料,主要参考了Java+Windows+ffmpeg
- 终端实现大文件上传一直都是比较难的技术,其中涉及到后端与前端的交互,稳定性和流量大小,而且实现原理每个人都有自己的想法,后端主流用的比较多的
- 关于Android的自定义控件,之前也写了两个,一个是简单地继承View,另一个通过继承Layout实现一个省市联动控件。这篇,将通过继承V
- 前言Android通过设置Alpha值图片淡化、透明度大家应该都知道,下面是段简单的示例代码:View v = findViewById(R
- 第三章 字符串,比较器和过滤器JDK引入的一些方法对写出函数式风格的代码很有帮助。JDK库里的一些的类和接口我们已经用得非常熟悉了,比如说S
- Unity没有像Vs那样的“*.sln”的项目工程文件,不能通过这个文件来打开工程。但是原有的打开已有工程的方法太过于麻烦了,则现在来通过添
- 链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,下面将逐一介绍。链表在数据结构中是基础
- 1.通过用FTP进行上传文件,首先要实现建立FTP连接,一般建立FTP连接,需要知道FTP配置有关的信息。一般要在Bean中建立一个Serv