C#8.0中的模式匹配
作者:天方 时间:2023-07-19 13:27:39
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
标签:C#,模式,匹配
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
解决android关于打开虚拟机时右侧工具栏不显示的问题
2023-02-24 12:42:54
![](https://img.aspxhome.com/file/2023/8/139478_0s.jpg)
C#如何使用Task执行异步操作
2023-01-12 03:34:41
C#服务器NFS共享文件夹搭建与上传图片文件的实现
2023-01-31 01:19:49
![](https://img.aspxhome.com/file/2023/9/92929_0s.jpg)
Android Studio的中文乱码问题解决方法
2023-06-05 04:48:14
![](https://img.aspxhome.com/file/2023/8/137508_0s.gif)
SpringBoot JS-SDK自定义微信分享的实现
2023-11-10 05:08:28
![](https://img.aspxhome.com/file/2023/6/59256_0s.jpg)
深入理解Java设计模式之抽象工厂模式
2023-11-28 12:11:34
![](https://img.aspxhome.com/file/2023/6/60336_0s.jpg)
浅谈Java中hashCode的正确求值方法
2021-11-24 11:40:53
Android仿京东搜索框渐变效果
2022-09-08 19:57:05
![](https://img.aspxhome.com/file/2023/0/114350_0s.gif)
Android 动画之TranslateAnimation应用详解
2023-06-27 06:17:59
![](https://img.aspxhome.com/file/2023/1/82411_0s.png)
ThreadPoolExecutor中的submit()方法详细讲解
2022-02-18 03:02:39
C# BitArray(点矩阵)转换成int和string的方法实现
2023-06-18 07:33:44
![](https://img.aspxhome.com/file/2023/0/66110_0s.png)
C#实现BBcode转为Markdown的方法
2021-10-11 12:34:12
Android Studio kotlin生成编辑类注释代码
2023-06-16 12:03:20
![](https://img.aspxhome.com/file/2023/7/82417_0s.jpg)
自定义注解和springAOP捕获Service层异常,并处理自定义异常操作
2023-04-04 05:26:04
![](https://img.aspxhome.com/file/2023/9/93149_0s.png)
SpringCloud升级2020.0.x版之OpenFeign简介与使用实现思路
2021-10-02 08:30:56
![](https://img.aspxhome.com/file/2023/2/88592_0s.jpg)
Android实现短信验证码获取自动填写功能(详细版)
2022-07-22 07:08:10
Spring超详细讲解创建BeanDefinition流程
2023-11-25 08:37:55
![](https://img.aspxhome.com/file/2023/0/59940_0s.png)
C#实现FTP传送文件的示例
2022-06-24 01:15:20
c#.net 常用函数和方法集
2022-08-03 01:44:00
Spring MVC中使用Controller如何进行重定向
2022-05-12 04:09:35