【问题标题】:if statement || or &&if 语句 ||要么 &&
【发布时间】:2012-10-25 16:37:48
【问题描述】:

我在编写如下 if 语句时遇到了问题:

public void foo(List<String> list)
{
     if(list == null || list.isEmpty()){
        // something
     }

     // else
}

这让我感到困扰:如果 list 为 null list.IsEmpty() 将失败(抛出异常,我正在调用 null 对象的方法),因为 list 为 null。但是,由于我在做 || (或)如果 list 为 null(这是真的),它将执行第二个块。这会引发异常。

这是正确的吗?在英语中,如果 list if null 或 empty 是有意义的。是这样吗?

对于 && 呢?还是短路?

谢谢。

【问题讨论】:

  • 这和|&amp;有什么关系?

标签: c# java if-statement


【解决方案1】:

||&amp;&amp; 运算符执行短路评估。一旦知道结果,它就会停止计算操作数。

这使得在空检查后使用值成为可能。如果计算第二个操作数,您就知道变量的状态。它更常与&amp;&amp; 运算符一起使用,而不是|| 运算符:

if (x != null && x.something == 42) ...

|&amp; 运算符不进行短路求值,因此可以保证对两个操作数进行求值。

如果您在条件下做某事,这可能很有用,并且您需要同时做这两件事:

int x, y;
if ((x = GetValue()) != 0 & (y = GetValue()) != 0) {
  // use x
  // use y
}

但是,条件有副作用通常是代码异味,所以这样的代码不经常使用。

【讨论】:

    【解决方案2】:

    通常机器会先评估最左边的条件,如果可以的话,然后快捷方式第二个条件。

    一个好的经验法则是,如果可以通过最左边的某个值完全确定真相(在您的情况下,如果 list==null 评估为 true),那么它将忽略右侧部分。

    【讨论】:

    • 编译器在这里不做特别的分析。它发出的代码总是计算第一个操作数,如果返回true,它从不计算第二个操作数。这不像是在计算该值是否可能为空......
    【解决方案3】:

    这是困扰我的问题:如果 list 为空 list.IsEmpty() 将失败

    答案是

    当使用||OR 运算符时只有当第一个条件失败时才会评估第二个条件。当第一个条件为真时,不评估第二个条件。它称为Short Circuit 行为。

    这是因为:

      true || any value is always result into true
    

    &amp;&amp; (AND) 也会发生同样的情况,但条件相反,即如果第一个条件失败,则第二个条件不会被评估为:

       false && any value is always going to be false.
    

    希望这可以帮助您理解这种行为。

    【讨论】:

      【解决方案4】:

      这让我感到困扰:如果 list 为 null list.IsEmpty() 将失败(抛出异常,我正在调用 null 对象的方法),因为 list 为 null。

      不,不会。 C# 和 Java 中的 || 运算符是短路。如果第一个操作数是true,则不会计算第二个操作数。

      有关详细信息,请参阅 Java 语言规范的 section 15.24 和 C# 4 规范的第 7.12 节。

      &amp;&amp; 运算符类似,但如果第一个操作数是 false,这一次它不会计算第二个操作数。所以写起来就好了:

      if (list != null && list.size() > 0)
      

      作为相反的条件。

      【讨论】:

      • ok if(list.isEmpty() || list == null) 那么这样可以吗?是吗?
      • @FooBar:不,那会爆炸的。
      • 会在java中爆炸,c#意味着抛出异常?对吗?
      • 我专门为IList.IsNullOrEmpty做了一个扩展方法,因为我们的应用程序充满了= null or .Count == 0,我厌倦了所有这些双重检查:)
      • 或者,您可以重新设计您的应用,以便 don't use nulls when you mean empties.
      猜你喜欢
      • 2012-09-10
      • 2016-11-20
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-06
      • 2016-03-26
      相关资源
      最近更新 更多