如何在 C# 8 中使用 模式匹配

模式匹配 是在 C# 7 中引入的一个非常????的特性,你可以在任何类型上使用 模式匹配,甚至是自定义类型,而且在 C# 8 中得到了增强,引入了大量的新模式类型,这篇文章就来讨论如何在 C# 8 中使用模式匹配。

C# 8 中的表达式模式

在 C# 8 中有三种不同的方式来表达这种模式。

  • 位置模式

  • 属性模式

  • Tuple模式

接下来看一下这些模式的相关代码及使用场景。

位置模式

位置模式主要利用类中的 Deconstruct 方法将类中的属性解构到一些零散的变量中,然后实现这些零散变量的比较,如果有点懵的话,考虑下面的 Rectangle 类。

public class Rectangle{public int Length { get; set; }public int Breadth { get; set; }public Rectangle(int x, int y) => (Length, Breadth) = (x, y);public void Deconstruct(out int x, out int y) => (x, y) = (Length, Breadth);}

接下来看一下如何在 Rectangle 上使用 位置模式。

static void Main(string[] args){Rectangle rectangle = new Rectangle(10, 10);var result = rectangle switch{Rectangle(0, 0) => "The value of length and breadth is zero.",Rectangle(10, 10) => "The value of length and breadth is same – this represents a square.",Rectangle(10, 5) => "The value of length is 10, breadth is 5.",_ => "Default."};Console.WriteLine(result);}

如果还是蒙的话继续看看最终生成的 IL 代码,一目了然。


private static void Main(string[] args)
{Rectangle rectangle = new Rectangle(10, 10);if (1 == 0){}if (rectangle == null){goto IL_0056;}rectangle.Deconstruct(out int x, out int y);string text;if (x != 0){if (x != 10){goto IL_0056;}if (y != 5){if (y != 10){goto IL_0056;}text = "The value of length and breadth is same – this represents a square.";}else{text = "The value of length is 10, breadth is 5.";}}else{if (y != 0){goto IL_0056;}text = "The value of length and breadth is zero.";}goto IL_005e;IL_0056:text = "Default.";goto IL_005e;IL_005e:if (1 == 0){}string result = text;Console.WriteLine(result);
}

C# 8 的 属性模式

属性模式常用于实现基于类中属性的比较,考虑下面的 Employee 类。

public class Employee{public int Id { get; set; }public string FirstName { get; set; }public string LastName { get; set; }public decimal Salary { get; set; }public string Country { get; set; }}

下面的代码片段展示了如何利用 属性模式 实现 employee 的个人所得税计算。

public static decimal ComputeIncomeTax(Employee employee, decimal salary) => employee switch{{ Country: "Canada" } => (salary * 21) / 100,{ Country: "UAE" } => 0,{ Country: "India" } => (salary * 30) / 100,_ => 0};

接下来看一下如何调用,代码如下。

static void Main(string[] args){Employee employee = new Employee(){Id = 1,FirstName = "Michael",LastName = "Stevens",Salary = 5000,Country = "Canada"};decimal incometax = ComputeIncomeTax(employee, employee.Salary);Console.WriteLine("The income tax is {0}", incometax);Console.Read();}

C# 8 的 tuple模式

Tuple 模式是另一种模式类型,常用于实现同一时刻对多个 input 值进行测试,下面的代码片段展示了如何使用 tuple模式。

static void Main(string[] args){static string GetLanguageNames(string team1, string team2) => (team1, team2) switch{("C++", "Java") => "C++ and Java.",("C#", "Java") => "C# and Java.",("C++", "C#") => "C++ and C#.",(_, _) => "Invalid input"};(string, string, string, string) programmingLanguages = ("C++", "Java", "C#", "F#");var language1 = programmingLanguages.Item1.ToString();var language2 = programmingLanguages.Item3.ToString();Console.WriteLine($"The languages selected are: {GetLanguageNames(language1, language2)}");}

C# 8 中对 模式匹配进行了若干种增强,使得代码写起来更加易读,易维护 和 更加高效,也是这么多年程序员翘首以盼的特性之一。

译文链接:https://www.infoworld.com/article/3518431/how-to-use-pattern-matching-in-csharp-80.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop 中zoo_0基础如何入门HADOOP

原标题:0基础如何入门HADOOP学习一样东西,肯定先要了解这个东西是什么,那什么是HADOOP呢?我们就来看看什么是HADOOP和如何学习HADOOP及学习内容。一,什么是HADOOPHADOOP是apache旗下的一套开源软件平台HADOOP提供的功能…

.NET 5 程序高级调试-WinDbg

上周和大家分享了.NET 5开源工作流框架elsa,程序跑起来后,想看一下后台线程的执行情况。抓了个进程Dump后,使用WinDbg调试,加载SOS调试器扩展,结果无法正常使用了:0:000> .loadby sos clrUnable to find…

.Net在线编辑工具.NET Fiddle

介绍推荐工具:.NET Fiddle推荐理由:在线调试,编译,运行.net代码,同时支持C#,VB.NET,F#推荐说明::对于.NET开发者来说是福音,因为我们可以不用再担心环境与庞大…

Typora markdown公式换行等号对齐_下了31个markdown编辑器,我就不信选不出一个好用的...

markdown编辑器测评标准总体标准渲染领域编辑领域数据管理其他TyporaVnoteMwebJoplinZettlrmacdownulyssesMarktextghostwriterfocusedbywordmarkedFarBoxNotablebear(熊掌笔记)iA writerMarxico(马克飞象)JetBrains系列的IDEsublime(贫穷,没有插件&…

WSUS专题之二:部署与规划1

部署场景: 我们这里仅讨论和Internet完全物理隔离的企业内网的WSUS部署 Internet断开的WSUS服务器环境 部署WSUS服务时,并不要求你必须连接到Internet。对于没有连接到Internet的网络环境,你一样可以部署WSUS服务。通过在其他连接到Internet上的WSUS服务…

.Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续交付/部署(CD)...

上一次演示了如何.Net Core in Docker - 使用阿里云Codepipeline及阿里云容器镜像服务实现持续集成(CI),讲到这里我们push一下代码后就自动编译、自动跑单元测试、自动构建镜像、自动推送镜像到私仓。那么离我们最初设定的目标只差那么一小步…

spyder pyecharts不显示_我的显示器需要定时校色吗?

在对图像色彩有要求的领域中,显示器的色彩准确是相当重要的。专业的显示器,能够具有更大的色域,更大的色深,以及更精确的ΔE色准值。这也是一个专业显示器所应有的品质。但是,我们在讨论色彩准确性的同时,往…

外观模式(Façade Pattern)

概述 在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖解耦?这就是要说…

WTM5.0发布,全面支持.net5

点击上方蓝字关注我们WTM5.0全面支持.net5WTM5.0是WTM框架开源2年以来最大的一次升级,全面支持.net5,大幅重构了底层代码,针对广大用户提出的封装过度,不够灵活,性能不高等问题进行了彻底的修改。这次升级使WTM继续保持…

rsa 模数 指数转换 c语言_模数转换,你必须知道的8个经典ADC转换电路方案

模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一…

linux定时关机命令_win10电脑定时关机命令

电脑定时关机命令可以帮助用户们很好的去设置电脑自动关机等,自己无需操作,电脑也会在对应的时间自动关机,使用起来还是非常方便的,现在就来看看电脑定时关机命令教程吧~电脑定时关机命令是什么:一、CMD设置关机1、点击…

为你的项目启用可空引用类型

为你的项目启用可空引用类型IntroC# 从 8.0 开始引入了可空引用类型,我们可以为项目启用可空引用类型来借助编译器来帮助我们更好的处理代码中的空引用的处理,可以避免我们写很多不必要 null 检查,提高我们的效率Why为什么我们要启用可空引用…

有哪些编辑软件可以编辑c语言,可以推荐一个手机上最好用且免费的c语言编辑器吗?...

C4droid(又名C编译器)呗,一个既可以编辑,还可以运行C语言的手机编程软件,下面我简单介绍一下这个软件的安装和使用:1.首先,安装C4droid,这个直接在手机应用中搜索就行,如下,大概也就…

cas 4.2.7 官方手册_海城市地区,保险手册核验的简单流程

最近海城市社保正在进行保险手册的核验工作,据说是要将当地社保数据并网,由省社保机构监督管理。我们这个百万人口的县级市,核验工作只由一个部门在固定的办事大厅里完成,工作量也是相当大了。核验工作自9月末开始,已进…

在 C# 中生成代码的四种方式——包括.NET 5中的Source Generators

Microsoft在最新的C#版本中引入了Source Generator。这是一项新功能,可以让我们在代码编译时生成源代码。在本文中,我将介绍四种C#中的代码生成方式,以简化我们的日常工作。然后,您可以视情况选择正确的方法。在 .NET 中&#xff…

powercfg -h off_驭鲛记的主演会是谁?肖战关系特别好的艺人朋友呢?白敬亭和吴映洁有没有故事啊?高伟光是不是隐婚生子了?讲讲管h和马司令呗?...

近期后台提问的比较多,没被翻牌的小可爱们不要着急,我会尽力把大家的问题都照顾到,笔芯1. 扒扒,想知道华策驭鲛记的主演会是谁?主演还没定,女主在接触热巴,男主还没接触,这个戏明年才…

使用 C# 9 的records作为强类型ID - JSON序列化

使用 C# 9 的records作为强类型ID - 路由和查询参数在本系列的上一篇文章中使用 C# 9 的records作为强类型ID - 路由和查询参数,我们注意到强类型ID的实体,序列化为 JSON 的时候报错了,就像这样:{"id": {"value&qu…

HP LaserJet 1010卡纸解决方法

HP LaserJet 1010 系列打印机在打印过程中出现卡纸多由以下原因造成:1、纸盒里放入了过多的纸张或纸张位置没有放好。2、打印时使用的介质类型超出打印机的支持范围。常见卡纸位置:1 、硒鼓下方;2 、进纸口;3 、出纸口图 2&#x…

HP产品选件查询网站

[url]http://h18000.www1.hp.com/products/quickspecs/ProductBulletin.html#intro[/url][url]http://h18006.www1.hp.com/products/quickspecs/Division/12175.html[/url]所有的可通地此链接来查询DL380G5:[url]http://h18004.www1.hp.com/products/quickspecs/12477_div/1247…

如何使用 C# 中的 ValueTuple

Tuple 是一种数据结构,它由一个有序的、有限的、大小固定的、不可变的异构元素的序列组成,当我们说 Tuple 中的元素不可变,意味着其中的元素不能进行修改。ValueTuple 是在 C# 7 中被引入,它主要用来解决 Tuple 的两个问题。解决语…