C# 拓展属性模式
2023-01-16 10:34 作者:SunnieShine | 我要投稿
因为属性模式本身有些地方很鸡肋,因为它可以嵌套,比如下面这样的代码:
这是之前的属性递归介绍的代码。这个写法里,Father
里再次包含一层大括号。
在新的模式匹配里,为了解决这种大括号嵌套太多层次导致可读性降低的问题,发明了拓展属性模式。拓展属性模式允许将这个代码简写为 Father.Name
:
即少一个大括号的层级级别:Prop: { NestProp: { } }
改成 Prop.NestedProp { }
的格式。
2、成员访问运算符的隐式判空
请注意,两种写法是等价的。可能你会认为前者的大括号的层次会让判断逻辑多一次 null
的判断:Prop is not null && Prop.NestedProp is not null
,而 Prop.NestedProp { }
这个写法因为 Prop
和 NestedProp
是直接引用的(用小数点关联起来),所以不会这么做。如果你这么想的话,那你就错了。C# 的拓展属性模式仅仅是为了简化代码才这么写代码的。这里的小数点(成员访问运算符)和我们以前学习的标准的成员访问运算符是不一致的语义:这里只能表示逻辑上的引用的层次关系,而一旦发现 Prop
是可空类型的话,那么访问 NestedProp
这个嵌套属性的时候就会必然先对外层的 Prop
属性数值做一次隐式判空,避免直接访问 NestedProp
而产生异常。
另一方面,正是因为编译器会自动隐式产生判空的情况,所以 C# 语法上不允许我们在这个小数点前面加 ?
,即比如 Prop?.NestedProp: { }
,这么写是错误的语法。假设你想要实现类似的行为,请必须使用 null or
模式:
来代替错误的语法: