C# 中的模式匹配属性模式如何用法?

来源:微信开发网作者:上海GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《C# 中的模式匹配属性模式如何用法?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C# 中的模式匹配属性模式如何用法?》有用,将其分享出去将是对创作者最好的鼓励。

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

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。