如果声明||或者&&

时间:2012-11-05 19:27:24

标签: c# java if-statement

我在编写if语句时遇到了麻烦,如下所示:

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

     // else
}

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

这是对的吗?在英语中,如果列表为null或空有意义。这是这种情况吗?

为什么&amp;&amp; ?还是短路?

感谢。

4 个答案:

答案 0 :(得分:28)

  

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

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

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

&&运算符类似,但这次它不会在第一个操作数为false时计算第二个操作数。所以写得很好:

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

作为相反的条件。

答案 1 :(得分:6)

||&&运营商进行短路评估。一旦结果已知,它就会停止评估操作数。

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

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

|&运算符不进行短路评估,因此可以保证评估两个操作数。

如果您在条件中执行某些操作,这可能很有用,您需要完成这两件事:

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

  

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

答案是

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

这是因为:

  true || any value is always result into true

&&(AND)也是如此,但条件相反,即如果第一个条件失败则第二个条件不被评估为:

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

希望这有助于您了解行为。