C# 中的模式匹配位置模式可以通过与对象的Deconstruct方法配合,快速将对象的多个属性拆解到单独的变量中,简化条件判断和数据提取的逻辑,减少冗余的代码编写。

位置模式解构对象的基础原理
要使用位置模式解构对象,首先需要为对应的类定义Deconstruct方法,该方法的作用是将对象的属性按照指定顺序输出为out参数。位置模式在匹配时,会自动调用这个Deconstruct方法,将对象的属性拆解后和模式中的值进行比对,或者赋值给对应的变量。
实现步骤与基础示例
1. 定义包含Deconstruct方法的类
首先我们定义一个Point类,包含两个坐标属性,并且定义Deconstruct方法,将X和Y两个属性输出。
public class Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y)
{
X = x;
Y = y;
}
// 定义解构方法,按顺序输出X和Y
public void Deconstruct(out int x, out int y)
{
x = X;
y = Y;
}
}
2. 使用位置模式解构对象
接下来我们可以使用位置模式对Point对象进行解构,比如在is表达式中使用位置模式,直接判断对象的坐标是否符合预期。
Point point = new Point(3, 5);
// 位置模式解构,判断X是否为3,Y是否为5
if (point is (3, 5))
{
Console.WriteLine("点的坐标符合预期");
}
// 解构的同时赋值给变量
if (point is (var x, var y))
{
Console.WriteLine($"解构后的坐标:X={x}, Y={y}");
}
结合switch表达式的使用场景
位置模式在switch表达式中非常实用,可以同时对对象的类型和属性进行匹配,简化多条件判断的逻辑。
Point testPoint = new Point(0, 0);
string result = testPoint switch
{
(0, 0) => "原点",
(var x, 0) when x > 0 => "X轴正方向的点",
(0, var y) when y > 0 => "Y轴正方向的点",
_ => "其他位置的点"
};
Console.WriteLine(result); // 输出:原点
注意事项
Deconstruct方法的参数必须是out类型,且参数的顺序需要和位置模式中使用的顺序一致,否则会导致解构结果错误。- 如果类没有定义
Deconstruct方法,使用位置模式解构对象会直接编译报错,因此必须先确认类是否支持解构。 - 位置模式解构时,如果只需要部分属性,可以使用弃元
_忽略不需要的属性,比如point is (3, _)表示只匹配X为3的情况,不关心Y的值。
复杂对象的解构示例
对于包含多个属性的复杂对象,也可以定义对应参数的Deconstruct方法,比如定义一个Person类,包含姓名、年龄、城市三个属性。
public class Person
{
public string Name { get; }
public int Age { get; }
public string City { get; }
public Person(string name, int age, string city)
{
Name = name;
Age = age;
City = city;
}
public void Deconstruct(out string name, out int age, out string city)
{
name = Name;
age = Age;
city = City;
}
}
// 使用位置模式解构Person对象
Person person = new Person("张三", 25, "北京");
if (person is ("张三", 25, "北京"))
{
Console.WriteLine("人员信息匹配");
}
// 忽略城市属性
if (person is ("张三", var age, _))
{
Console.WriteLine($"张三的年龄是:{age}");
}