本文转载自微信公众号「码农读书」,作者码农读书 。转载本文请联系码农读书公众号。
模式匹配 是在 C# 7 中引入的一个非常??的特性,你可以在任何类型上使用 模式匹配,甚至是自定义类型,而且在 C# 8 中得到了增强,引入了大量的新模式类型,这篇文章就来讨论如何在 C# 8 中使用模式匹配。
C# 8 中的表达式模式
在 C# 8 中有三种不同的方式来表达这种模式。
接下来看一下这些模式的相关代码及使用场景。
位置模式
位置模式主要利用类中的 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
2021年3月24日,主题为《数据的世界,世界的数据》的星环科技2021春季新品发布会...
前提条件 请您在购买前确保已完成注册和充值。详细操作请参见 如何注册公有云管...
建站 什么 虚拟主机 够用?这要看搭建的是什么类型的网站。比如个人博客类型的网...
信息化2.0时代提出开展智慧教育创新发展行动。2019年2月,中共中央、国务院印发...
本文整理自直播《Hologres 数据导入/导出实践-王华峰(继儒)》 视频链接: https:/...
Docker生成新镜像版本的两种方式 There are two ways Docker can generate new m...
在Python语言中有如下3种方法: 成员方法 类方法(classmethod) 静态方法(staticm...
摘要 元旦期间 订单业务线 告知 推送系统 无法正常收发消息,作为推送系统维护者...
【51CTO.com快译】 数据可视化工具不断发展,提供更强大的功能,同时改善可访问...
从 10.0.0 版开始,异步迭代器就出现在 Node 中了,在本文中,我们将讨论异步迭...