x?.y?.z是什么意思?(涉及IT技术)

68

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

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

我知道Type?表示Type可为空,但假设xyz是本地变量,x?.y?.z是什么意思?

11
假设是空值检查。 - ddavison
有没有其他人有“C#模式匹配”草案规范的链接,而不是在MSN OneDrive上?该链接在某些公司代理后面已经失效了。:( - RLH
这个回答解决了你的问题吗?C# 6.0中的问号和点运算符?.是什么意思? - Heretic Monkey
3个回答

97

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

它实际上相当于:

x == null ? null
   : x.y == null ? null
   : x.y.z
换句话说,这是一种“安全”的方式来执行x.y.z,因为沿途的任何属性都可能为null。
另外相关的是null coalescing运算符(??),它提供了可替换null的值。

66
我已经等了好久好久了。 - romanoza
12
值得注意的是,在新的语法中,假设 x 和 x.y 都不为 null,x.y 仅会被计算一次,而在当前的等效语法中会被计算两次。 - petelids
3
缩进使您的回答难以阅读。 我个人会将冒号缩进到与匹配问号相同的列上。 - Kijewski
2
@Kay:如果这就是你们公司的样式指南,那么你可以按照自己的方式来做。 :-) - StriplingWarrior
2
@RevanProdigalKnight,这不是Java 8和Java 9的计划,所以我猜大约在未来10年内。 - om-nom-nom
显示剩余9条评论

29

Null-Conditional Operator ?是C# 6.0中推出的新特性。

x?.y?.z意味着:

  • 首先,检查x是否不为空,然后检查y,否则返回null,
  • 其次,当x不为空时,检查y,如果不为空,则返回z,否则返回null。

最终返回值将是znull

如果没有这个运算符,如果x为空,则访问x.y将引发Null Reference Exception,而Null-Conditional运算符可以帮助避免显式检查null。

它是一种避免Null Reference Exception的方式。

详见:Getting a sense of the upcoming language features in C#

 

8 - Null-conditional operators

 

有时候代码会淹没在对null的检查中。Null-conditional运算符允许您仅在接收器不为null时访问成员和元素,否则提供null结果:

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

我想补充一下,这是C# 6的一个特性。 - dee-see
5
@tkocmathla,不对,??x!=null ? x:y是不同的:x ?? y相当于x != null ? x : y。而x?.y相当于x != null ? x.y : null - Tim S.
@Tim S. 谢谢,解释得很好。 - tkocmathla
1
@Habib,它仍然是错误的:“如果x不为空,则返回y,否则返回null”,这并不会返回y,而是返回x.y.z或null。 - mclaassen
1
@mclaassen,也许我在考虑它们是两个不同的步骤。最终返回值将是znull - Habib

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

基本上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接