数据库

如何在 C# 8 中使用 模式匹配

时间:2010-12-5 17:23:32  作者:应用开发   来源:域名  查看:  评论:0
内容摘要:本文转载自微信公众号「码农读书」,作者码农读书 。转载本文请联系码农读书公众号。模式匹配 是在 C# 7 中引入的一个非常??的特性,你可以在任何类型上使用 模式匹配,甚至是自定义类型,而且在 C#

本文转载自微信公众号「码农读书」,中使作者码农读书 。用模转载本文请联系码农读书公众号。式匹

模式匹配 是中使在 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 的 属性模式

属性模式常用于实现基于类中属性的比较,考虑下面的云南idc服务商 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

云服务器提供商
copyright © 2025 powered by 益强资讯全景  滇ICP备2023006006号-31sitemap