本文转载自微信公众号「码农读书」,中使作者码农读书 。用模转载本文请联系码农读书公众号。式匹
模式匹配 是中使在 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
云服务器提供商