前言

模式匹配是一种测试表达式以确定其是否具有某些特征的技术。

例如, 下面的Employee类和Manager类:

public class Employee
{public int Id { get; set; }public string Name { get; set; }public Manager? Manager { get; set; }
}public class Manager : Employee
{public string Position { get; set; }
}

我们可以使用模式匹配,检查Employee实例变量的实际类型并且匹配其属性,如下所示:

Employee obj = new Manager { Id=1, Name="zhangsan", Position="CEO" };
if(obj is Manager { Position: "CEO" } ceo)
{Console.WriteLine(ceo.Name);
};

Extended Property Patterns

如果要使用模式匹配检查变量嵌套的属性,则书写起来比价复杂,如下所示:

if(obj is Employee { Manager: { Name:"lisi", Manager:{ Position: "CEO" } } } employee)

而在.NET 6中,我们可以使用.引用属性的嵌套成员,这种方式称为Extended Property Patterns(扩展属性模式)

将上面的代码改写后如下:

if(obj is Employee { Manager.Name:"lisi", Manager.Manager.Position: "CEO" } employee)

另外,使用扩展属性模式不仅可以引用类定义的嵌套属性,同时还可以使用嵌套属性原生类型的属性,如下所示:

if(obj is Employee { Manager.Name.Length:4 } employee)

结论

需要注意的是,如果变量的Manager属性为null,或者任何嵌套属性为null 都不会得到NullReferenceException。因为在这里编写模式是为了检查对象是否匹配,而不是使用代码直接访问该属性。

这意味着,如果Manager属性为null,则模式{Manager.Name:"lisi"}不匹配,则上面if语句的条件计算结果为false,仅此而已。

利用Extended Property Patterns这种简化的语法,可以使模式匹配表达式更易于阅读,特别是对于嵌套较深的类型。

如果你觉得这篇文章对你有所启发,请帮忙点个或者在看

.NET 6新特性试用 | 模式匹配之Extended Property Patterns相关推荐

  1. .NET 6新特性试用 | 总结:我最喜欢的5个特性

    前言 不知不觉,<.NET 6新特性试用>系列文章已经写了20多篇,而今天终于要告一段落了. 如果你还没有看过,详细文章列表在这里: .NET 6新特性试用系列 在这么多特性中,我最喜欢如 ...

  2. JDK 14的新特性:instanceof模式匹配

    JDK 14的新特性:instanceof模式匹配 JDK14在2020年的3月正式发布了.可惜的是正式特性只包含了最新的Switch表达式,而Records,patterns,text blocks ...

  3. .NET 6新特性试用 | 可空引用类型

    前言 在查看<隐式using指令>功能时,我们在csproj中发现这样一个属性: 那么,Nullable到底是干嘛的? 可为空上下文 严格来说,这不是新特性,而是C# 8.0引入的特性之一 ...

  4. 5.0 新特性试用体验之 Clustered Index

    作者:hzc989 原文来源: https://tidb.net/blog/69dd056c [是否原创]是 [首发渠道]TiDB 社区 [目录] 一.引言 二.基础前情回顾 三.era withou ...

  5. .NET 6新特性试用 | PeriodicTimer

    前言 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windo ...

  6. .NET 6新特性试用 | 可写JSON DOM API

    前言 我们常用JSON的方式,是将类对象序列化/反序列化: var user = new User { Name = "My IO" }; var json = JsonSeria ...

  7. .NET 6新特性试用 | SDK工作负载

    前言 为了应对.NET SDK能够支持的程序集项目(例如iOS.Android.WASM)的不断增长,从.NET 6开始,允许用户仅安装必要的SDK(例如ASP.NET Core),而不是一次性安装& ...

  8. .NET 6新特性试用 | LINQ功能改进

    前言 .NET6为LINQ添加了多个新API,在本文中,我们将始终使用User类逐一演示这些添加到LINQ中的内容: public class User {public string Name { g ...

  9. .NET 6新特性试用 | ArgumentNullException卫语句

    前言 在前面的文章中(<可空引用类型>),我们介绍过编译器会帮我们检查空引用,但是仅仅是警告.最好的方式还是在运行时用卫语句进行检查: private void Test(WeatherF ...

最新文章

  1. 面试常用shell脚本_Shell脚本编写及常见面试题
  2. Ubuntu使用实录
  3. 最大期望算法与混合高斯模型的推导
  4. P3332-[ZJOI2013]K大数查询【树套树】
  5. 如何测量代码运行时间
  6. 过去赚钱靠产品—买卖产品
  7. 安装详细步骤win7_windows安装器怎么安装原版win7【详细教程】
  8. 隐藏网络计算机,XP电脑如何在网络中隐藏自己的计算机名称?
  9. AdminLTE-2.4.10源码包
  10. Linux- Showdown 命令详解
  11. java打印ascii码_JAVA实现打印ascii码表代码
  12. [位压] 高精度加法
  13. 上位机发送与接收下位机数据
  14. 港媒:梁洛施偷吃排卵药擅生双胞胎 惹怒李泽楷
  15. 网络连接变成小地球,提示无法访问internet
  16. 团队融洽之拓展器械拓展训练
  17. Jquery锚点导航定位、css设置头部左侧固定,右侧内容滚动
  18. 2015-07-20-struts-struts2简介
  19. [samba]Samba服务器架设
  20. Camlytics:智能摄像头监控软件

热门文章

  1. 85、交换机安全MAC层***配置实验之Port-Security
  2. tcp有限状态机分析
  3. HTML5 Canvas 画纸飞机组件
  4. WEB API:语音识别
  5. 隧道6in4 和隧道6to4(GNS3)
  6. 个人站立会议-----20181216
  7. 进程共享变量#pragma data_seg用法
  8. PHP面向对象(OOP)----分页类
  9. android快捷开发之Retrofit网络加载框架的简单使用
  10. IUnknown接口QueryInterface函数介绍