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#,模式,匹配
0
投稿

猜你喜欢

  • 解决android关于打开虚拟机时右侧工具栏不显示的问题

    2023-02-24 12:42:54
  • C#如何使用Task执行异步操作

    2023-01-12 03:34:41
  • C#服务器NFS共享文件夹搭建与上传图片文件的实现

    2023-01-31 01:19:49
  • Android Studio的中文乱码问题解决方法

    2023-06-05 04:48:14
  • SpringBoot JS-SDK自定义微信分享的实现

    2023-11-10 05:08:28
  • 深入理解Java设计模式之抽象工厂模式

    2023-11-28 12:11:34
  • 浅谈Java中hashCode的正确求值方法

    2021-11-24 11:40:53
  • Android仿京东搜索框渐变效果

    2022-09-08 19:57:05
  • Android 动画之TranslateAnimation应用详解

    2023-06-27 06:17:59
  • ThreadPoolExecutor中的submit()方法详细讲解

    2022-02-18 03:02:39
  • C# BitArray(点矩阵)转换成int和string的方法实现

    2023-06-18 07:33:44
  • C#实现BBcode转为Markdown的方法

    2021-10-11 12:34:12
  • Android Studio kotlin生成编辑类注释代码

    2023-06-16 12:03:20
  • 自定义注解和springAOP捕获Service层异常,并处理自定义异常操作

    2023-04-04 05:26:04
  • SpringCloud升级2020.0.x版之OpenFeign简介与使用实现思路

    2021-10-02 08:30:56
  • Android实现短信验证码获取自动填写功能(详细版)

    2022-07-22 07:08:10
  • Spring超详细讲解创建BeanDefinition流程

    2023-11-25 08:37:55
  • 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
  • asp之家 软件编程 m.aspxhome.com