属性模式通过{PropertyName: pattern}语法检查对象属性值,要求对象非NULL且属性可读,支持常量、变量及嵌套匹配,如person is {Name: “Alice”, Age: >=30}或employee is {Address: {City: “Beijing”}},并可用于switch表达式实现多条件分支,提升代码简洁性与可读性。
在 c# 中,属性模式(Property Pattern)用于在模式匹配中检查对象的属性值是否符合预期。它不关心对象的具体类型,只关注对象是否有指定的属性以及这些属性是否满足特定条件。
属性模式的基本语法
属性模式使用 { } 包裹一组属性名与子模式的组合,语法如下:
exampleObject is { PropertyName: pattern }
如果 exampleObject 不为 null 且其 PropertyName 的值匹配 pattern,则整个模式匹配成功。
如何匹配对象属性
属性模式通过以下方式匹配对象:
- 对象不能为 null,否则匹配失败
- 对象必须具有模式中列出的公共可读属性
- 每个属性的值需满足对应的子模式(可以是常量、变量、递归模式等)
例如,判断一个 Person 对象的 Name 是否为 “Alice”,Age 是否大于 30:
if (person is { Name: “Alice”, Age: >= 30 })
{
console.WriteLine(“找到符合条件的 Alice”);
}
嵌套属性匹配
属性模式支持嵌套,可以检查复杂对象的深层属性:
if (employee is { Address: { City: “Beijing”, ZipCode: “100000” } })
{
// 匹配地址城市为 Beijing 且邮编为 100000 的员工
}
这要求 employee 和 employee.Address 都不为 null,且对应属性匹配。
结合 with 表达式和 switch 模式
属性模式也常用于 switch 表达式中进行多条件分支判断:
return shape switch
{
{ Type: “Circle”, Radius: >= 0 } => “圆形”,
{ Type: “Rectangle”, Width: var w, Height: var h } => $”矩形 ({w}x{h})”,
_ => “未知形状”
};
基本上就这些。属性模式让 C# 的模式匹配更贴近实际数据结构,写起来简洁又直观。只要对象有对应属性且值匹配,就能成功识别,无需强制类型转换。注意 null 值会直接导致匹配失败,设计时要考虑这一点。
评论(已关闭)
评论已关闭