欢迎光临散文网 会员登陆 & 注册

C# 拓展属性模式

2023-01-16 10:34 作者:SunnieShine  | 我要投稿

1、语法

因为属性模式本身有些地方很鸡肋,因为它可以嵌套,比如下面这样的代码:

这是之前的属性递归介绍的代码。这个写法里,Father 里再次包含一层大括号。

在新的模式匹配里,为了解决这种大括号嵌套太多层次导致可读性降低的问题,发明了拓展属性模式。拓展属性模式允许将这个代码简写为 Father.Name

即少一个大括号的层级级别:Prop: { NestProp: { } } 改成 Prop.NestedProp { } 的格式。

2、成员访问运算符的隐式判空

请注意,两种写法是等价的。可能你会认为前者的大括号的层次会让判断逻辑多一次 null 的判断:Prop is not null && Prop.NestedProp is not null,而 Prop.NestedProp { } 这个写法因为 PropNestedProp 是直接引用的(用小数点关联起来),所以不会这么做。如果你这么想的话,那你就错了。C# 的拓展属性模式仅仅是为了简化代码才这么写代码的。这里的小数点(成员访问运算符)和我们以前学习的标准的成员访问运算符是不一致的语义:这里只能表示逻辑上的引用的层次关系,而一旦发现 Prop 是可空类型的话,那么访问 NestedProp 这个嵌套属性的时候就会必然先对外层的 Prop 属性数值做一次隐式判空,避免直接访问 NestedProp 而产生异常。

另一方面,正是因为编译器会自动隐式产生判空的情况,所以 C# 语法上不允许我们在这个小数点前面加 ?,即比如 Prop?.NestedProp: { },这么写是错误的语法。假设你想要实现类似的行为,请必须使用 null or 模式:

来代替错误的语法:


C# 拓展属性模式的评论 (共 条)

分享到微博请遵守国家法律