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

tko*_*hla 69 c# pattern-matching

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

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

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

Str*_*ior 98

请注意,此语言功能仅适用于C#6及更高版本.

它实际上相当于:

x == null ? null
   : x.y == null ? null
   : x.y.z
Run Code Online (Sandbox Code Playgroud)

换句话说,这是一种"安全"的方式x.y.z,沿途的任何属性都可能为空.

还有一个空合并运算符(??),它提供了替换值null.

  • 我已经等了很久了 (66认同)
  • 值得注意的是,xy仅使用新语法进行一次评估,但使用当前等效值进行两次评估(假设x和xy为非null). (12认同)
  • 缩进使您的答案难以阅读.我一个人会在与匹配问号相同的列上缩进冒号. (3认同)
  • @Kay:如果这就是风格指南如何运作chez vous,欢迎你按照自己的意愿去做.:-) (2认同)
  • @RevanProdigalKnight它没有安排用于java 8和java 9,所以我想在接下来的10年里. (2认同)

Hab*_*bib 29

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

x?.y?.z 手段

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

最终的回报价值是znull.

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

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

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

8 - 空条件运算符

有时代码往往会在null检查中淹没一点.空条件运算符只允许您在接收方不为null时访问成员和元素,否则提供null结果:

int? length = customers?.Length; // null if customers is null
Run Code Online (Sandbox Code Playgroud)

  • @tkocmathla不,`??`是完全不同的:`x ?? y`就像`x!= null?x:y`.而`x?.y`就像`x!= null?xy:null`. (5认同)