📅  最后修改于: 2023-12-03 15:13:49.731000             🧑  作者: Mango
在 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# 的表达式模式匹配,我们可以更简洁、易读地处理多个模式的情况。这个新特性可以提高代码的可读性,减少繁琐的类型转换和条件判断,使代码更加优雅和精简。