C#的属性模式是模式匹配的重要组成部分,它允许开发者直接根据对象的属性值来匹配对应的分支,不需要手动编写大量的属性取值和条件判断代码,能够大幅简化条件分支的编写逻辑。

属性模式的基本语法
属性模式的核心逻辑是将对象的属性与目标值进行匹配,基本语法格式为{ 属性名: 匹配模式 },可以和其他模式组合使用,也可以单独作为匹配条件。
最常见的使用场景是搭配switch表达式,下面通过一个简单的示例来演示基础用法。假设我们有一个表示用户信息的类,包含用户名和年龄两个属性:
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
现在需要根据用户的年龄区间返回对应的用户等级,使用属性模式的写法如下:
User user = new User { Name = "张三", Age = 25 };
string level = user switch
{
// 匹配年龄属性为18到30的情况
{ Age: >= 18 and <= 30 } => "青年用户",
// 匹配年龄属性大于30小于60的情况
{ Age: > 30 and < 60 } => "中年用户",
// 匹配年龄属性大于等于60的情况
{ Age: >= 60 } => "老年用户",
// 其他情况匹配
_ => "未知等级用户"
};
Console.WriteLine(level); // 输出:青年用户
在if语句中使用属性模式
属性模式不仅可以和switch表达式搭配,也可以在if语句的条件判断中使用,语法格式为对象 is { 属性名: 匹配值 }。
还是以上面的User类为例,判断用户是否为成年用户:
User user = new User { Name = "李四", Age = 16 };
if (user is { Age: >= 18 })
{
Console.WriteLine("该用户是成年用户");
}
else
{
Console.WriteLine("该用户是未成年用户"); // 输出:该用户是未成年用户
}
匹配多个属性的场景
属性模式支持同时匹配多个属性,只需要在花括号内添加多个属性匹配规则即可,多个规则之间是同时满足的关系。
比如我们需要匹配年龄大于18且用户名为指定的值的用户:
User user = new User { Name = "王五", Age: 22 };
if (user is { Age: > 18, Name: "王五" })
{
Console.WriteLine("匹配到目标用户"); // 输出:匹配到目标用户
}
嵌套属性匹配
如果对象的属性本身是另一个对象,属性模式也支持嵌套匹配,通过属性名.子属性名的方式指定要匹配的子属性。
假设我们有一个订单类,订单中包含用户对象,需要匹配订单中用户的年龄大于18的订单:
public class Order
{
public int OrderId { get; set; }
public User OrderUser { get; set; }
}
Order order = new Order
{
OrderId = 1001,
OrderUser = new User { Name = "赵六", Age = 20 }
};
if (order is { OrderUser.Age: > 18 })
{
Console.WriteLine($"订单{order.OrderId}的用户是成年用户"); // 输出:订单1001的用户是成年用户
}
使用注意事项
- 属性模式匹配时,被匹配的对象不能为null,否则会直接跳过该匹配分支,如果需要处理null的情况,需要单独添加null匹配的 branch。
- 匹配的属性必须是可访问的,比如类的私有属性无法直接通过属性模式匹配。
- 属性模式的匹配顺序是自上而下执行的,一旦匹配到对应的分支就会停止后续匹配,所以更具体的匹配规则应该放在更靠前的位置。
和传统写法的对比
如果不使用属性模式,上面的年龄判断逻辑需要写成如下形式:
User user = new User { Name = "张三", Age = 25 };
string level;
if (user.Age >= 18 && user.Age <= 30)
{
level = "青年用户";
}
else if (user.Age > 30 && user.Age < 60)
{
level = "中年用户";
}
else if (user.Age >= 60)
{
level = "老年用户";
}
else
{
level = "未知等级用户";
}
对比可以看出,属性模式的写法更加简洁,不需要重复书写user.Age的取值逻辑,代码的可读性也更高。
C#模式匹配属性模式switch_表达式修改时间:2026-06-20 18:42:25