亿华智慧云亿华智慧云

如何在 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 的 属性模式

属性模式常用于实现基于类中属性的比较,考虑下面的WordPress模板 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 ", 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

亿华云计算
赞(151)
未经允许不得转载:>亿华智慧云 » 如何在 C# 8 中使用 模式匹配

相关推荐