使用Null条件运算符检查可能为null的对象的值

时间:2017-08-21 12:03:05

标签: c# c#-6.0 null-conditional-operator

我一直在玩C#6的Null条件运算符(more info here)。

我非常喜欢语法,我认为它使代码更具可读性但是我认为当你遇到一个对象本身的属性值时,代码究竟会做什么是值得怀疑的。是空的。

例如,如果我有一个带有十进制属性的类,并且我想要对该十进制值进行条件检查,我会写一些类似的东西:

if (foo?.Bar > max)
{
   // do something
}

表面看起来很棒......如果foo不为null,请获取Bar的值并检查它是否大于最大值,如果是,则执行某些操作。

然而,如果foo为null会怎么样?!

This documentation about the new and improved features of C# 6说了几句话:

  

如果实际上对象的值为null,则为null-conditional   运算符将返回null。它将对Bar的调用短路,并且   立即返回null,避免编程错误   否则会导致NullReferenceException。

我写了一个小提琴here,表明它确实有用,并且正在做我期待它做的事情但是我无法理解它是如何决定条件的结果。

短路如何等于假?在我的脑海中,这段代码现在要说“如果foo为null,请检查null是否为> max,这是不可能的,所以返回false”或“如果foo为null,那么foo!= null将返回false,所以你得到一个假“但文档说null条件检查返回null,而不是false。

3 个答案:

答案 0 :(得分:16)

  

短路如何等于假?

mkSimple

beginnerProgram来:

if (foo?.Bar > max)
{
   // do something
}

因此,短路不等于Decimal? bar = null; if (foo != null) bar = foo.Bar; if (bar > max) { // do something } 。它等于false(可为空Decimal?),然后Decimal相比。

另请参阅:roughly equivalent

答案 1 :(得分:7)

  

它将对Bar

的调用短路

表示如果父项已经为空,则停止检查对象引用链中的以下步骤(.)。这意味着比较运算符不会受到影响,因为您使用值而不是在链中移动。此行为称为空传播。您可以在Code ProjectDave Fancher找到一些不错的说明。

使用null条件运算符返回可以为double?的可空值。然后将此值与max进行比较。 Microsoft

很好地描述了这种比较中null的行为
  

当您与可空类型进行比较时,如果值为1   可以为空的类型是null,而另一个不是,所有的比较   评估为假,除了!=(不等于)。

这意味着:

if (null > max)
{
    //never called
}

答案 2 :(得分:-1)

Null Conditional Operator仅应用于有关对象属性的多个赋值(请参阅对象映射等等)的场景,如果出现属性的null条件,则每次都可能无聊。

或者对于以下情况:

int? count = customers?[0]?.Orders?.Count();  // null if customers, the first customer, or Orders is null 

将此运算符用于if测试表达式可能会导致意外行为,例如在if statements case on fiddler中,您获得了"传递" test(最后if语句),但null值,显然不是有效案例