模式匹配是C#7中引入的一项出色功能。您可以在任何数据类型(甚至自定义数据类型)上使用模式匹配,并使用它从表达式中提取值。 模式匹配在C#8.0中得到了增强,它引入了许多新的模式类型。 本文讨论了如何在C#8.0中使用模式匹配。
若要使用本文提供的代码示例,您应该在系统中安装Visual Studio 2019。 如果您还没有副本,则可以在此处下载Visual Studio 2019 。
在Visual Studio中创建控制台应用程序项目
首先,让我们在Visual Studio中创建一个.NET Core控制台应用程序项目。 假设系统中已安装Visual Studio 2019,请按照以下概述的步骤在Visual Studio中创建新的.NET Core控制台应用程序项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
- 点击下一步。
- 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
- 单击创建。
这将在Visual Studio 2019中创建一个新的.NET Core控制台应用程序项目。在本文的后续部分中,我们将使用该项目来处理C#8中的模式匹配。
在Visual Studio中更新您的C#语言版本
为了能够在Visual Studio中使用C#8.0,必须使用针对.NET Core的项目。 到目前为止,一切都很好。 但是,您可能还需要在项目中更改C#的语言版本。 为此,请按照以下概述的步骤操作:
- 右键单击该项目。
- 选择“属性”以调用属性窗口。
- 单击构建->高级。
- 单击语言版本的下拉控件。
- 选择C#8.0作为语言版本。
- 单击确定。
在C#8.0中表达模式
在C#8.0中,您可以通过三种不同的方式来表达模式:
- 位置模式
- 属性模式
- 元组模式
在本部分中,我们将在适当的时候使用相关的代码示例来探讨每种模式。
C#8中的位置模式
位置模式利用类上的Deconstruct方法并包含嵌套模式-因此它们也称为递归模式。 在递归模式中,一个表达式的输出变为另一表达式的输入。
使用位置模式时,通常将检查是否为null,然后调用相应的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类上的位置模式的方法。
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);
执行上面的代码时,您应该在控制台窗口中看到以下输出。
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; }
}
以下代码演示了如何利用财产模式来计算员工的所得税。
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中的元组模式
元组模式是另一种类型的模式,可用于同时测试多个输入。 以下代码说明了如何使用元组模式。
private 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.0在模式匹配方面引入了一些增强功能,可以帮助您编写更具可读性,可维护性和效率的代码。 新的模式提供了一种很棒的新代码编写方式,这将使C#开发人员的生活在未来几年变得更加轻松。
From: https://www.infoworld.com/article/3518431/how-to-use-pattern-matching-in-csharp-80.html