C# 8.0中的模式匹配

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

时间: 2024-10-09 15:55:30

C# 8.0中的模式匹配的相关文章

C# 6.0可能会支持模式匹配了

今天在CodePlex的Roslyn讨论区发现了一个帖子:Draft spec for records and pattern-matching in C#,估计MS计划在C# 6.0中支持模式匹配了. 设计草案的文档如下:Pattern Matching for C#?,看起来非常不错的样子. 模式匹配的缺席一直是C#的弱项,.Net语言中,F#是支持模式匹配的,但日常的编程过程中感觉还是C#这种瑞士军刀级的语言更为方便.这个升级还是非常给力的,不过估计又有一大批人要抱怨说看不懂了,又升级了神

C# 7.0 中的新增功能

来源:Mark Michaelis 链接:msdn.microsoft.com/magazine/mt790184   解构函数 从 C# 1.0 开始,就能调用函数,就是将参数组合起来并封装到一个类中的构造函数.但是,从来没有一种简便的方式可将对象解构回其各个组成部分.例如,假设有一个 PathInfo 类,它采用文件名的每个元素(目录名.文件名.扩展名),并将它们组合成一个对象,然后支持操作对象的不同元素.现在,假设你需要将该对象提取(解构)回其各个组成部分. 在 C# 7.0 中,通过解构

bash 参数替换中的模式匹配

参数替换中的模式匹配 # 和## 从字符串的左边开始,并且去掉左边的字符串, % 和 %% 从字符串的右边开始,并且去掉右边的子串. 例如 name=hello lhhs "root" name=${name#'"'}; name=${name%'"'} 结果为root ################################Start Script####################################### 1 #!/bin/bash 2

ASP.Net4.0中新增23项功能

这篇文章介绍Visual Studio 2010 (ASP.Net 4.0)的新功能. 1.代码片段(Code Snippets): 代码段是预先开发的代码模板,可以节省我们对有关语法思考的时间.在VS 2005和VS 2008中,已经有建立了很多代码段.不过,这些只适用于隐藏代码(code behind).在VS 2010中代码片段支持JScript,HTML以及asp.net标记.在下面画面,展示了JScript和HTML片段的快捷菜单. 在JS中: 在Html中 : 2.New Profi

Spark源码的角度思考Scala中的模式匹配

学习了从Spark源码的角度思考Scala中的模式匹配,如case class应用,伴生对象中用apply,所以没有new class,直接进行模式匹配,例子如下 Case class RegisterWorker( Id: string, Host: string, Port: int, Cores:int, Memory:int, webUiPort:int, publicAddress:string, Extend DeployMessage{ Utils.checkHost(host,”

C# 7.0中可能出现的语法

今天在MSDN上看到的微软关于微软关于C# 7.0特性的Work List,主要特性如下: Tuple增强 Tuple的可读性一直不是很好, 很多时候宁愿新写一个类也不使用Item1, Item2这种不知何物的属性: ????public Tuple<int, int> Tally(IEnumerable<int> values) { ... }????var t = Tally(myValues);????Console.WriteLine($"Sum: {t.Item

7.ASP.NET MVC 5.0中的Routing【路由】

大家好,这一篇向大家介绍ASP.NET MVC路由机制.[PS:上一篇-->6. ASP.NET MVC 5.0中的HTML Helpers[HTML帮助类] ] 路由是一个模式匹配系统,它确保你能够将浏览器的请求,传递到控制器特定的Action方法上.路由引擎使用路由表,来将浏览器发送来的请求URL和路由表中定义的URL进行匹配.RouteConfig文件用来添加路由规则,路由是调用控制器和Action的方式. 我们在Global.asax文件中注册路由:通过在Application_Star

【译】.NET Core 3.0 中的新变化

.NET Core 3.0 是 .NET Core 平台的下一主要版本.本文回顾了 .Net Core 发展历史,并展示了它是如何从基本支持 Web 和数据工作负载的版本 1,发展成为能够运行 Web.桌面.机器学习.容器.IoT 等的版本 3.0. .NET Core 1 .NET Core 的历史可追溯到几年前,版本 1 是在 2016 年推出,旨在生成第一版开放源代码和跨平台(Windows.macOS 和 Linux)的 .NET.灵感来源于只能使用开放源代码框架的客户,以及需要在 Li

C# 8.0中的新功能

微信公众号:Fintech极客 作者为软件开发工程师,就职于金融信息科技类公司,通过CFA一级,分享计算机和金融相结合领域的技术和知识. C# 8.0中的新功能 C# 8.0已经推出来好长一段时间了, 由于公司目前主要使用的还是6.0版本,加上之前个人事情较多,一直没有总结,今天主要查看和测试微软官方文档中的内容:https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-8 只读成员(Readonly members) 在st