模式匹配 是在 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 中使用 模式匹配相关推荐

  1. 在linux下,如何在C语言中使用正则表达式

    http://hi.baidu.com/d_south/blog/item/9d22a34b1fc2bcf483025c53.html 在linux下,如何在C语言中使用正则表达式(整理) 2008- ...

  2. 如何在Java 8中使用LocalDateTime格式化/解析日期-示例教程

    Java项目中的常见任务之一是将日期格式化或解析为String,反之亦然. 解析日期表示您有一个表示日期的字符串,例如" 2017-08-3",并且要将其转换为表示Java中日期的 ...

  3. 如何在sqlite3连接中创建并调用自定义函数

    #!/user/bin/env python # @Time :2018/6/8 14:44 # @Author :PGIDYSQ #@File :CreateFunTest.py '''如何在sql ...

  4. Iar环境c语言调用汇编函数,如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数?...

    我在硬故障处理程序中有一些程序集.程序集基本上是为了传递当前堆栈指针作为参数(在R0中).它看起来像这样...如何在IAR EWARM中通过内联汇编程序在另一个模块中调用C函数? __asm(&quo ...

  5. 学习如何在AutoCad土木工程中绘制建筑设计图

    学习如何在AutoCad中绘制建筑设计图从平面图到AutoCad土木工程中的整栋建筑 你会学到: 如何绘制房屋地图 如何绘制建筑设计 如何从AutoCad打印或出图 AutoCaD使用 AutoCaD ...

  6. 如何在OS X中打印到PDF文件

    如何在OS X中打印文件到PDF文件? 其实不需要安装任何其他软件,OS X本身支持打印到PDF文件这个功能. 具体操作详见下面文章: Want to save a document or web p ...

  7. 转 如何在IOS设备中去掉屏幕上的status bar

    引入 如何在IOS设备中去掉屏幕上的status bar,即:不显示设备上方的[网络.时间.电池??]条? 操作 方法一: 在-info.list项目文件中,加上"Status bar is ...

  8. react中纯函数_如何在纯React中创建电子邮件芯片

    react中纯函数 by Andreas Remdt 由Andreas Remdt 如何在纯React中创建电子邮件芯片 (How to create email chips in pure Reac ...

  9. 如何在您HTML中嵌入视频和音频

    by Abhishek Jakhar 通过阿比舍克·贾卡(Abhishek Jakhar) 如何在您HTML中嵌入视频和音频 (How to embed video and audio in your ...

最新文章

  1. python 同时发多个请求
  2. C++ namespace 命名空间
  3. 分布式服务的事务如何处理?比如dubbo,服务与服务之间的事务怎么处理比较好,现在有没有开源的解决方案?...
  4. ccs 移植创建新工程_3D生物打印器官新突破,模拟肺与肝脏,未来可能实现定制人类器官...
  5. [UOJ50]链式反应
  6. 磁盘未被格式化,是否格式化数据灾难应急方案
  7. 为什么录像总是很暗_深度:为什么看马拉多纳的踢球视频,并不觉得他很厉害?...
  8. SlidingMenu使用笔记
  9. BUG没确认就重启机器,大哥你凭什么说有这样的BUG
  10. Atitit. js mvc 总结(2)----angular 跟 Knockout o99 最佳实践
  11. WIN10开机启动深度优化超详细万字以上,开机5秒
  12. lnmp一键安装包 php7,LNMP一键安装包 V1.7 正式版发布
  13. 泛函分析 04.06 有界线性算子 - 习题课
  14. EXCEL常用函数总结
  15. GD2016noip获奖名单
  16. 武汉新时标文化传媒有限公司短视频创作者实现突围?
  17. cocos creator尝试使用tween的几种新实现方案
  18. java int溢出,结果只会保留低32位,高位会抛弃掉
  19. 经典的足球明星广告--[困兽斗]
  20. matlab自适应amc,自适应调制解调(ACM),Adaptive modulation and coding (AMC),音标,读音,翻译,英文例句,英语词典...

热门文章

  1. [Swift]LeetCode1146. 快照数组 | Snapshot Array
  2. springboot三种过滤功能的使用与比较
  3. IBM X System ServerGuide 8.41 服务器 系统安装 引导盘
  4. 【转】PHP的Trait 特性
  5. iOS Newsstand Tutorial
  6. airdroid黑屏_如何使用AirDroid从PC控制Android设备
  7. 华为堡垒机_安恒信息成为“华为云优秀严选合作伙伴”,携手保障“云上”资产安全访问...
  8. Cygwin使用指南
  9. Windows 7 自动更新失败导致无法进系统解决方案
  10. Java(C#)基础差异-语法