属性模式用于在 C# 中检查对象的某些属性或字段是否符合指定条件,常用于 switch 表达式 或 is 表达式 中。它让你可以直接解构并匹配对象的属性值,而不需要先提取变量。
基本语法
pattern:对象类型 { 属性名: 值模式 }
你可以嵌套多个属性,并结合其他模式(如常量、变量、递归模式等)使用。
1. 在 is 表达式中使用属性模式
判断一个对象的属性是否满足某个条件:
示例:
var person = new { Name = "Alice", Age = 30 };
<p>if (person is { Age: 30, Name: "Alice" })
{
Console.WriteLine("匹配成功");
}
只有当
Age是 30 且
Name是 "Alice" 时才会进入 if 块。
2. 结合 switch 表达式使用
可用于根据对象的不同属性组合返回不同结果:
示例:
string result = person switch
{
{ Age: < 18 } => "未成年人",
{ Age: >= 65 } => "老年人",
{ Age: >= 18 and < 65 } => "成年人",
_ => "未知"
};
这里用到了关系模式(=)与属性模式结合,非常简洁地完成分类。
3. 嵌套属性模式
如果对象包含复杂属性,也可以进行嵌套匹配:
示例:
var address = new { City = "Beijing", ZipCode = "100000" };
var person2 = new { Name = "Bob", Address = address };
<p>if (person2 is { Address: { City: "Beijing" } })
{
Console.WriteLine("居住在北京");
}
匹配的是
Address的
City属性。
4. 使用属性模式提取值(带变量声明)
可以同时匹配并提取属性值到变量中:
示例:
if (person is { Name: var name, Age: var age })
{
Console.WriteLine($"姓名: {name}, 年龄: {age}");
}
这相当于从对象中“解构”出属性值,便于后续使用。
5. 与 null 安全结合
属性模式在访问属性时会自动处理 null 情况。例如:
object obj = null;
bool isYoung = obj is { Age: < 18 }; // false,不会抛异常
即使 obj 为 null,表达式安全返回 false,不会引发 NullReferenceException。
基本上就这些。属性模式让代码更清晰、简洁,特别适合做数据形状匹配。不复杂但容易忽略细节,比如大小写敏感和类型匹配。
