如何在 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
如何在 C# 8 中使用 模式匹配相关推荐
- 在linux下,如何在C语言中使用正则表达式
http://hi.baidu.com/d_south/blog/item/9d22a34b1fc2bcf483025c53.html 在linux下,如何在C语言中使用正则表达式(整理) 2008- ...
- 如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程
Java项目中的常见任务之一是将日期格式化或解析为String,反之亦然. 解析日期表示您有一个表示日期的字符串,例如" 2017-08-3",并且要将其转换为表示Java中日期的 ...
- 如何在sqlite3连接中创建并调用自定义函数
#!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...
- Iar环境c语言调用汇编函数,如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?...
我在硬故障处理程序中有一些程序集.程序集基本上是为了传递当前堆栈指针作为参数(在R0中).它看起来像这样...如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数? __asm(&quo ...
- 学习如何在AutoCad土木工程中绘制建筑设计图
学习如何在AutoCad中绘制建筑设计图从平面图到AutoCad土木工程中的整栋建筑 你会学到: 如何绘制房屋地图 如何绘制建筑设计 如何从AutoCad打印或出图 AutoCaD使用 AutoCaD ...
- 如何在OS X中打印到PDF文件
如何在OS X中打印文件到PDF文件? 其实不需要安装任何其他软件,OS X本身支持打印到PDF文件这个功能. 具体操作详见下面文章: Want to save a document or web p ...
- 转 如何在IOS设备中去掉屏幕上的status bar
引入 如何在IOS设备中去掉屏幕上的status bar,即:不显示设备上方的[网络.时间.电池??]条? 操作 方法一: 在-info.list项目文件中,加上"Status bar is ...
- react中纯函数_如何在纯React中创建电子邮件芯片
react中纯函数 by Andreas Remdt 由Andreas Remdt 如何在纯React中创建电子邮件芯片 (How to create email chips in pure Reac ...
- 如何在您HTML中嵌入视频和音频
by Abhishek Jakhar 通过阿比舍克·贾卡(Abhishek Jakhar) 如何在您HTML中嵌入视频和音频 (How to embed video and audio in your ...
最新文章
- python 同时发多个请求
- C++ namespace 命名空间
- 分布式服务的事务如何处理?比如dubbo,服务与服务之间的事务怎么处理比较好,现在有没有开源的解决方案?...
- ccs 移植创建新工程_3D生物打印器官新突破,模拟肺与肝脏,未来可能实现定制人类器官...
- [UOJ50]链式反应
- 磁盘未被格式化,是否格式化数据灾难应急方案
- 为什么录像总是很暗_深度:为什么看马拉多纳的踢球视频,并不觉得他很厉害?...
- SlidingMenu使用笔记
- BUG没确认就重启机器,大哥你凭什么说有这样的BUG
- Atitit. js mvc 总结(2)----angular 跟 Knockout o99 最佳实践
- WIN10开机启动深度优化超详细万字以上,开机5秒
- lnmp一键安装包 php7,LNMP一键安装包 V1.7 正式版发布
- 泛函分析 04.06 有界线性算子 - 习题课
- EXCEL常用函数总结
- GD2016noip获奖名单
- 武汉新时标文化传媒有限公司短视频创作者实现突围?
- cocos creator尝试使用tween的几种新实现方案
- java int溢出,结果只会保留低32位,高位会抛弃掉
- 经典的足球明星广告--[困兽斗]
- matlab自适应amc,自适应调制解调(ACM),Adaptive modulation and coding (AMC),音标,读音,翻译,英文例句,英语词典...
热门文章
- [Swift]LeetCode1146. 快照数组 | Snapshot Array
- springboot三种过滤功能的使用与比较
- IBM X System ServerGuide 8.41 服务器 系统安装 引导盘
- 【转】PHP的Trait 特性
- iOS Newsstand Tutorial
- airdroid黑屏_如何使用AirDroid从PC控制Android设备
- 华为堡垒机_安恒信息成为“华为云优秀严选合作伙伴”,携手保障“云上”资产安全访问...
- Cygwin使用指南
- Windows 7 自动更新失败导致无法进系统解决方案
- Java(C#)基础差异-语法