x?.y?.z是什么意思?


68

C#中的模式匹配规范草案包含以下代码示例:

Type? v = x?.y?.z; 
if (v.HasValue) {
    var value = v.GetValueOrDefault();     
    // code using value 
} 

据我所知,Type?表明Type是空的,但假设xy以及z是当地居民有哪些呢x?.y?.z是什么意思?


11
我假设为nullcheck。–
ddavison 2014年

是否有人有MSN OneDrive上没有的该“ C#模式匹配”草案规范的另一个链接?该链接在某些公司代理之后被断开。:(
RLH 2014年

Answers:


97

请注意,此语言功能仅在C#6和更高版本中可用。

实际上等效于:

x == null ? null
   : x.y == null ? null
   : x.y.z

换句话说,这是一种“安全”的方式x.y.z,其中沿途的任何属性都可能为null。

关联合并运算符(??)也与此相关,该运算符提供了替代的值null


66
我已经等了很久了
romanoza

12
值得注意的是,使用新语法只会对xy进行一次评估,而使用当前等效语法将对xy进行两次评估(假设x和xy为非null)。
petelids 2014年

3
缩进使您的答案难以阅读。我会在与匹配问号相同的列上缩进冒号。
凯2014年

2
@Kay:如果这就是样式指南的工作方式,欢迎您随意进行。:-)
StriplingWarrior 2014年

2
@RevanProdigalKnight它没有计划在Java 8和Java 9中使用,所以我想大概在未来10年。
om-nom-nom 2014年

29

它是Null传播算子/ Null-Conditional算子?。C#6.0中提出的新功能

x?.y?.z 手段

  • 首先,检查是否x不为null,然后检查 y否则返回null,
  • 第二,如果x不为null,则检查y,如果x不为null,则返回,z否则返回null。

最终的返回值将是znull

如果没有此运算符x,则如果为null,则访问x.y将引发Null Reference Exception,Null-Conditional运算符有助于避免显式检查null。

这是避免Null引用异常的一种方法。

请参阅:了解C#中即将推出的语言功能

8-空条件运算符

有时,代码倾向于在null检查中淹没。使用空条件运算符可以仅在接收者不为空时访问成员和元素,否则提供空结果:

int? length = customers?.Length; // null if customers is null

我要补充一点,这是C#6的功能。
迪,请看2014年

5
@tkocmathla不,??是非常不同的:x ?? y就像x != null ? x : y。而x?.yx != null ? x.y : null
Tim S.

@Tim S.谢谢,很好的解释。
tkocmathla 2014年

1
@Habib仍然错误:“如果x不为null,则返回y,否则返回null”。这不返回y,而是返回xyz或null。
mclaassen 2014年

1
@mclaassen,可能是我在解释考虑他们两个不同的步骤。最终的回报值为znull
Habib

2
 this.SlimShadies.SingleOrDefault(s => s.IsTheReal)?.PleaseStandUp();

基本上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.