如何在 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,一经查实,立即删除!

相关文章

linux下找不到libc 库,Linux-覆盖libc open()库函数

我在库&中有glibc提供的相同的覆盖open().我首先在库中设置了LD_PRELOAD,因此当进程调用open()时,将调用库中定义的open.问题:-glibc中还有其他几个函数,一旦示例为getpt(),就会调用open(),当getpt()调用open()时,将调用glibc中定义的open(),我将如何使getpt ()…

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…

精妙Sql语句

1. 判断a表中有而b表中没有的记录 select a.* from tbl1 a left join tbl2 b on a.key b.key where b.key is null 虽然使用in也可以实现,但是这种方法的效率更高一些 2. 新建一个与某个表相同结构的表 select * into b from a where 1&l…

.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服务…

linux gcc出错,编译arm-linux-gcc出错

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼在ubuntu12.04下编译arm的交叉编译工具链执行../gcc-4.6.0/configure --target$TARGET --prefix$PREFIX --without-headers --enable-languagesc --disable-threads --with-newlib --disable-shared --disable-libmudflap --disabl…

.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,通常是指一个将模拟信号转变为数字信号的电子元件。通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一…

C语言怎么提出大写字母,c语言函数toupper()如何将小写字母转换为大写字母

c语言函数toupper()如何将小写字母转换为大写字母?大小写字母怎么转换?函数需要引入的头文件:#include toupper()的定义:int toupper(int c);toupper()函数介绍:若参数 c 为小写字母则将该对应的大写字母返回。toupper…

生活的目标是什么

07-1-25长大了,生活没目标了.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />学生时代的我,总想着闯一番事业.期待着自己可以有敏锐的头脑,和不俗的思想.并且为了这个目标辛勤地努力着.我是一个会考试的机器人,擅长的只是追逐答…

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

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

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

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

c语言配电自动化,我是电气工程及其自动化专业的要学C语言吗?

电气工程、控制科学与工程、计算机科学与技术 主要课程&#xff1a;电路理论、信息电子技术、电力电子技术、自动控制原理、微机原理与应用、电气工程基础、电机学、电器学、电力系统分析、电机设计、高低压电器、电机控制、智能化电器原理与应用、电力系统继电保护、电力系统综…

系统启动小知识

登录时不显示欢迎屏幕为了加快计算机启动的速度&#xff0c;我们完全可以通过组策略设置在每次用户登录时将Windows XP欢迎屏幕隐藏。位置&#xff1a;\用户配置\管理模板\系统\ 要显示欢迎屏幕&#xff0c;请依次单击“开始→程序→附件→系统工具”选项&#xff0c;然后单击“…

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

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