📜  C#中的模式匹配(1)

📅  最后修改于: 2023-12-03 15:29:48.610000             🧑  作者: Mango

C#中的模式匹配

模式匹配是C# 7.0中引入的一项新功能,它允许我们对类型进行匹配并根据相应的模式执行不同的代码。模式匹配可以与switch语句相结合,也可以用在if语句中作为表达式。

模式匹配的类型

下面是C#中常用的模式匹配类型:

基于类型的模式匹配

基于类型的模式匹配使用is运算符检查对象是否为指定类型的实例。

if (obj is string s)
{
    // 如果obj是string类型,则将其转换为s
}
基于常量的模式匹配

基于常量的模式匹配使用switch语句进行匹配。可以使用常量,枚举或字符串等类型作为匹配条件。

switch (obj)
{
    case int i:
        // 如果obj是int类型,则将其转换为i
        break;
    case string s when s.Length < 5:
        // 如果obj是字符串类型,并且其长度小于5,则将其转换为s
        break;
    case MyClass { Name: "John", Age: 18 } mc:
        // 如果obj是MyClass类型,并且其属性Name为John,属性Age为18,则将其转换为mc
        break;
    default:
        // 如果obj不满足上述条件,则执行默认的代码
        break;
}
基于位置的模式匹配

基于位置的模式匹配将一个对象解构成多个变量并将其与指定的模式进行匹配。它适用于解构类型,元组,数组等。

if (obj is (string name, int age) tuple)
{
    // 如果obj是元组类型,并且包含了name和age这两个元素,则将其转换为tuple
}
模式匹配的进阶用法

除了基本的模式匹配类型外,C#中还提供了一些进阶用法。

is运算符的类型模式

在基于类型的模式匹配中,可以将is运算符与类型进行结合来定义一个新的类型匹配模式。

if (obj is MyClass m)
{
    ...
}
else if (obj is null)
{
    ...
}
switch表达式的新特性

在C# 8.0中,switch表达式已经得到了大幅升级。现在可以使用以下语法:

result = switch (input)
{
    pattern1 when condition1 => result1,
    pattern2 when condition2 => result2,
    _ => defaultResult
};

其中,pattern1和pattern2是匹配模式,condition1和condition2是条件,result1和result2是结果,_表示默认情况。此外,这种语法还允许我们返回多个值。

引用类型的模式匹配

在C# 7.0中,我们可以使用is运算符对引用类型进行匹配。

if (obj is IEnumerable<string> strings)
{
    // 如果obj是IEnumerable<string>类型,则将其转换为strings
}

但是,在C# 8.0中,我们可以使用另一种语法:

if (obj is { Count: > 0 } collection)
{
    // 如果obj是一个非空的集合,则将其转换为collection
}

这里的{ Count: > 0 }表示了一个匿名对象,包含一个Count属性并且其值大于0。

with表达式

C# 9.0引入了新的with表达式,用于更新已有的对象。

MyClass myObj = new MyClass
{
    Name = "John",
    Age = 18
};

MyClass updatedObj = myObj with { Age = 20 };

其中with { Age = 20 }表示将myObj对象的Age属性更新为20,并创建一个新的对象。