📜  c# switch 表达式模式匹配 - C# (1)

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

C# Switch 表达式模式匹配

在 C# 8.0 中,引入了一种新的语法称为表达式模式匹配,可以在 switch 语句中使用。这个新特性可以帮助我们更简洁地处理多种不同的模式匹配情况。

基本语法

下面是 switch 表达式模式匹配的基本语法:

result = expressionToMatch switch
{
    pattern1 => result1,
    pattern2 => result2,
    pattern3 when condition => result3,
    _ => result
};

这里的 expressionToMatch 是要进行模式匹配的表达式,result 是根据匹配结果返回的值。每个 pattern 后面跟着 =>,接着是对应的 result

最后的 _ 表示匹配不到任何模式时的默认情况。

模式匹配

表达式模式匹配中支持多种不同的模式:

常量模式

常量模式用于匹配特定的常量值,比如数字、字母或字符串。

switch (x)
{
    case 0:
        // 当 x 的值为 0 时执行此处代码
        break;
    case 1:
        // 当 x 的值为 1 时执行此处代码
        break;
    default:
        // 当 x 的值既不是 0 也不是 1 时执行此处代码
        break;
}
类型模式

类型模式用于匹配特定的类型或通过模式匹配实现类型转换。

switch (shape)
{
    case Circle c:
        // 当 shape 是 Circle 类型时执行此处代码,并将其转换为 Circle 对象 c
        break;
    case Rectangle r:
        // 当 shape 是 Rectangle 类型时执行此处代码,并将其转换为 Rectangle 对象 r
        break;
    default:
        // 当 shape 是其它类型时执行此处代码
        break;
}
变量模式

变量模式用于匹配任意值,并将其赋值给一个新的变量。

switch (shape)
{
    case Circle c:
        // 当 shape 是 Circle 类型时执行此处代码,并将其转换为 Circle 对象 c
        Console.WriteLine($"半径为 {c.Radius} 的圆");
        break;
    case Rectangle { Width: var w, Height: var h }:
        // 当 shape 是 Rectangle 类型且宽度赋值给变量 w,高度赋值给变量 h 时执行此处代码
        Console.WriteLine($"宽度为 {w}、高度为 {h} 的矩形");
        break;
    default:
        // 当 shape 是其它类型时执行此处代码
        break;
}
合并模式

合并模式允许将多个模式组合在一起,以便更灵活地匹配。

switch (color)
{
    case Color.Red or Color.Green or Color.Blue:
        // 当 color 是 Red、Green 或 Blue 时执行此处代码
        break;
    case var c when c.IsDarkColor():
        // 当 color 是一个暗色时执行此处代码,且将其赋值给变量 c
        break;
    default:
        // 当 color 不满足任何模式时执行此处代码
        break;
}
示例

下面是一个示例,演示了如何使用 switch 表达式模式匹配:

public class Shape
{
    public int Sides { get; set; }
}

public class Circle : Shape
{
    public double Radius { get; set; }
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }
}

public string DescribeShape(Shape shape)
{
    return shape switch
    {
        Circle c => $"半径为 {c.Radius} 的圆",
        Rectangle { Width: var w, Height: var h } => $"宽度为 {w}、高度为 {h} 的矩形",
        _ => $"不可识别的形状"
    };
}

var circle = new Circle { Radius = 5 };
var rectangle = new Rectangle { Width = 3, Height = 4 };

Console.WriteLine(DescribeShape(circle));      // 输出: "半径为 5 的圆"
Console.WriteLine(DescribeShape(rectangle));   // 输出: "宽度为 3、高度为 4 的矩形"
总结

通过使用 C# 的表达式模式匹配,我们可以更简洁、易读地处理多个模式的情况。这个新特性可以提高代码的可读性,减少繁琐的类型转换和条件判断,使代码更加优雅和精简。