C# 中的模式匹配属性模式如何匹配对象?

属性模式通过{PropertyName: pattern}语法检查对象属性值,要求对象非null且属性可读,支持常量、变量及嵌套匹配,如person is {Name: “Alice”, Age: >=30}或employee is {Address: {City: “Beijing”}},并可用于switch表达式实现多条件分支,提升代码简洁性与可读性。

c# 中的模式匹配属性模式如何匹配对象?

在 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 值会直接导致匹配失败,设计时要考虑这一点。

以上就是C# 中的模式匹配属性模式如何匹配对象?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1440562.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 17:12:10
下一篇 2025年12月17日 17:12:18

相关推荐

  • C# 中的异步流如何处理数据序列?

    IAsyncEnumerable 是 .NET Core 3.0 引入的接口,用于异步枚举数据序列,支持 await foreach 实现非阻塞的数据流处理;通过 async IAsyncEnumerable 方法结合 yield return 可逐个产生数据,适用于网络、文件或数据库等异步数据源;…

    2025年12月17日
    000
  • C#中如何优化EF Core的保存操作?有哪些最佳实践?

    合理减少SaveChanges调用次数,使用AddRange等批量方法,禁用自动追踪,结合原生批量库如EFCore.BulkExtensions,并显式管理事务,避免冗余查询,可显著提升EF Core保存性能。 在使用 EF Core 时,保存操作(SaveChanges)如果处理不当,很容易成为性…

    2025年12月17日
    000
  • 如何用C#实现数据库连接的重试逻辑?代码示例是什么?

    使用循环和Polly实现C#数据库重试,1.通过for循环结合延迟与最大重试次数应对连接故障;2.采用指数退避策略提升重试效率;3.推荐Polly库实现异步重试与日志记录;4.需合理设置重试上限并及时释放连接。 在C#中实现数据库连接重试逻辑,主要是为了应对短暂的网络波动或数据库服务暂时不可用的情况…

    2025年12月17日
    000
  • ASP.NET Core 中的标签助手是什么?

    标签助手是ASP.NET Core中用于简化Razor视图开发的服务器端组件,它允许以HTML风格语法动态生成和修改元素,无需编写C#代码块。相比传统HTML帮助器,其语法更贴近原生HTML,提升可读性与维护性。通过在_ViewImports.cshtml中添加@addTagHelper *, Mi…

    2025年12月17日
    000
  • C#中如何使用EF Core的查询延迟加载代理?如何启用?

    启用 EF Core 延迟加载需安装 Microsoft.EntityFrameworkCore.Proxies 包,实体导航属性标记为 virtual,并在 DbContext 配置中调用 UseLazyLoadingProxies(),即可实现访问时自动加载关联数据。 在 C# 中使用 EF C…

    2025年12月17日
    000
  • Entity Framework Core中的DbSet属性代表什么?如何使用?

    DbSet代表数据库中的一张表,是EF Core中用于映射实体类与数据库表的核心组件。每个DbSet属性对应一个实体类,如DbSet映射Products表。通过DbContext中的DbSet,可执行查询、添加、更新和删除操作。使用时需定义实体类,如Product,并在继承DbContext的上下文…

    2025年12月17日
    000
  • C# 中的接口默认方法如何用于版本控制?

    接口默认方法是在接口中提供具体实现的方法,允许实现类选择是否重写。例如 ILogger 接口新增 LogError 和 LogWarning 默认方法,无需修改已有实现类即可使用,避免因接口升级导致的编译错误。它支持向后兼容、渐进式升级、封装通用逻辑及跨平台定制,但需避免频繁更改默认实现、慎用访问控…

    2025年12月17日
    000
  • .NET 中的源代码生成器如何生成序列化代码?

    源代码生成器在编译时分析标记类型并生成序列化代码,避免运行时反射开销。1. 它基于Roslyn解析语法树和语义信息;2. 扫描如[JsonSerializable]等特性标识的类型;3. 自动生成高效、强类型的序列化方法;4. 以System.Text.Json为例,在编译时生成PersonCont…

    2025年12月17日
    000
  • C# 中的元组如何简化多返回值方法?

    元组在C#中简化了多返回值的实现,避免了定义类或使用out参数的复杂性。通过命名元组元素可提升代码可读性,如(string result, bool success)形式直接返回多个值,并支持调用时解构赋值,例如var (message, ok) = ParseInput(“123&#8…

    好文分享 2025年12月17日
    000
  • 什么是数据库的时空数据?在C#中如何查询地理数据?

    时空数据是包含时间与空间维度的数据,用于描述对象在特定时间的地理位置,广泛应用于地图、导航、智慧城市等领域。在C#中查询地理数据通常使用支持空间扩展的数据库(如SQL Server、PostgreSQL/PostGIS),结合Entity Framework Core和Microsoft.Entit…

    2025年12月17日
    000
  • WinForms中如何实现自定义控件的绘制?

    答案:自定义控件绘制需重写OnPaint方法,利用Graphics对象进行绘图,并通过Invalidate()触发重绘;性能优化包括启用双缓冲、局部刷新、缓存绘制结果及避免频繁创建GDI对象;用户交互通过处理鼠标键盘事件改变控件状态并触发重绘实现;结合GraphicsPath、变换、渐变等GDI+高…

    2025年12月17日
    000
  • 微服务间通信使用 gRPC 有哪些优势?

    gRPC因高效性能、强类型安全和多语言支持成为微服务通信理想选择,其基于Protobuf和HTTP/2实现高性能传输,支持四种通信模式满足流式场景,通过.proto文件契约优先设计提升接口一致性与可维护性,结合拦截器和可观测性工具链优化开发运维,虽前端直连受限但可通过gRPC-Gateway兼容RE…

    2025年12月17日
    000
  • 如何使用 SpecFlow 为 .NET 微服务编写 BDD 测试?

    使用 SpecFlow 实现 .NET 微服务 BDD 测试,首先通过 Gherkin 编写可读性强的 .feature 文件描述业务行为,如定义“查询订单状态”场景;接着在 C# 中创建步骤定义类,用正则绑定 Gherkin 步骤到具体实现,调用 API 并验证响应;然后集成 WebApplica…

    2025年12月17日
    000
  • C# 中的 Span 如何提升性能?

    Span通过避免内存复制和减少GC压力显著提升性能,它提供统一接口访问栈、堆或本机内存,支持零拷贝切片操作,如解析字符串字段时不创建临时对象;利用ReadOnlySpan可优化只读场景的字符串处理,延迟分配并降低开销,在热路径中替代传统Substring或数组拷贝能极大提高效率。 <img s…

    好文分享 2025年12月17日
    000
  • 如何使用 ML.NET 为微服务添加机器学习功能?

    明确业务场景并准备数据,如用户行为分类、订单预测等,确保结构化数据来源清晰;2. 使用ML.NET的MLContext构建训练管道,定义数据结构与算法,训练二分类或回归模型;3. 保存模型至文件并在微服务启动时加载,通过PredictionEngine实现实时预测;4. 将模型推理集成到API中,结…

    2025年12月17日
    000
  • C#的MemoryStream在桌面开发中怎么应用?

    MemoryStream在C#桌面开发中核心作用是将内存作为文件流操作,提升效率与灵活性。它广泛用于数据序列化、图像处理、临时缓冲和模拟文件操作,避免频繁磁盘I/O,增强性能、安全性和测试便利性。通过合理设置容量、重用流、慎用ToArray()和GetBuffer()可优化内存占用,适用于中等数据量…

    2025年12月17日
    000
  • C#中如何实现数据库连接字符串的加密?方法是什么?

    推荐使用.NET内置ProtectedConfigurationProvider加密配置节,或结合AES自定义加密、环境变量与密钥管理服务,根据项目类型选择适配方案。   使用aspnet_regiis.exe工具加密 connectionStrings 节:aspnet_regiis -pef &…

    2025年12月17日
    000
  • C#的运算符重载是什么?如何使用?

    运算符重载提升C#代码可读性,通过public static方法用operator关键字为自定义类型定义+、-等操作,如ComplexNumber实现+法;需遵守行为符合直觉、重载==时同步重写Equals和GetHashCode等规则,避免滥用。 C#的运算符重载允许你为自定义类型赋予运算符(如+…

    2025年12月17日
    000
  • C#的base关键字如何调用父类成员?有什么限制?

    base关键字用于访问直接基类成员,主要在派生类中调用基类构造函数、方法、属性或索引器。其核心使用场景包括:1. 构造函数初始化时通过: base(…)确保基类先被构造;2. 重写方法中通过base.Method()扩展而非替换基类逻辑;3. 访问被重写的基类属性或索引器。与this指向…

    2025年12月17日
    000
  • C# 中的命名参数在 API 设计中的优势?

    命名参数通过显式指定参数名提升代码可读性,使多参数调用更清晰;支持参数顺序无关性,增强可维护性并减少错误;结合可选参数可跳过中间项直接设置所需值,优化API易用性与安全性。 命名参数在 C# 中允许调用方法时明确指定参数名称,这在 API 设计中带来了显著的优势,尤其提升了代码的可读性和易用性。 提…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信