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

模式匹配是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控制台应用程序项目。

  1. 启动Visual Studio IDE。
  2. 点击“创建新项目”。
  3. 在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。
  4. 点击下一步。
  5. 在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。
  6. 单击创建。

这将在Visual Studio 2019中创建一个新的.NET Core控制台应用程序项目。在本文的后续部分中,我们将使用该项目来处理C#8中的模式匹配。

在Visual Studio中更新您的C#语言版本

为了能够在Visual Studio中使用C#8.0,必须使用针对.NET Core的项目。 到目前为止,一切都很好。 但是,您可能还需要在项目中更改C#的语言版本。 为此,请按照以下概述的步骤操作:

  1. 右键单击该项目。
  2. 选择“属性”以调用属性窗口。
  3. 单击构建->高级。
  4. 单击语言版本的下拉控件。
  5. 选择C#8.0作为语言版本。
  6. 单击确定。
c 8视觉工作室 IDG

图1:选择C#8.0作为Visual Studio中项目的编程语言。

在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中的位置模式 IDG

图2:实际的位置模式匹配!

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中的属性模式 IDG

图3:实际中的属性模式匹配!

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中的元组模式 IDG

图4:实际的元组模式匹配!

C#8.0在模式匹配方面引入了一些增强功能,可以帮助您编写更具可读性,可维护性和效率的代码。 新的模式提供了一种很棒的新代码编写方式,这将使C#开发人员的生活在未来几年变得更加轻松。

From: https://www.infoworld.com/article/3518431/how-to-use-pattern-matching-in-csharp-80.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值