-3

I've tried using the following code, but as far as I can tell it only checks the first two variables.

if (var1 || var2 || var3)
{
    // Do something.
}
4

4 回答 4

3

如果您需要评估所有三个,您可以使用:

if (var1 | var2 | var3)
{
    // Do something.
}

反而。有这样的需求似乎很奇怪,但假设这三个属性都是吸气剂有副作用的属性......

使用方法可能是:

if (DoWork() | DoDuties() | DoFinalStuff())
{
    // At least one method returned true ("success")
}

在任何情况下都会调用所有三个方法。

于 2013-04-09T19:26:37.920 回答
3

您的代码正在正确检查三个变量之一是否为真,即

var1 || var2 || var3

如果 var1、var2 和 var3 中的任何一个为真,则为真。这里唯一的微妙之处是实际检查是使用短路逻辑执行的:如果 var1 为真,则不会检查 var2 和 var3 等。

于 2013-04-09T19:32:08.140 回答
2

我觉得其他答案已经涵盖了您需要做的事情,但我想更好地解释正在发生的事情。

||or运算符是所谓的&&“短路”运算符,如果它找到满足其需要的条件,它将停止检查其他元素(它找到的第一个元素true或它找到||的第false一个元素&&)。

所以实际上

if(var1 || var2 || var3)
   SomeAction();

和做的一样

if(var1)
    SomeAction();
else if(var2)
    SomeAction();
else if(var3)
    SomeAction();

如果您只使用|而不是||它将在返回结果之前评估所有成员,类似于此

bool combined = var1;
combined = var2 **OR'ed with** combined; 
combined = var3 **OR'ed with** combined; 

if(combined)
    SomeAction();

短路的一个非常有用的实际用途是在调用成员或方法之前检查 null。在下面的示例中,假设 var1 是一个可能为 null 的变量,并且您需要在var1.DataAvailable()为 true 时执行操作。例如

if(var1 != null && var1.DataAvailable())
{
    //do somthing with var1 when data is available
}

是相同的

if(var1 != null)
{
    if(var1.DataAvailable())
    {
        //do somthing with var1 when data is available
    }
}

由于短路,您将永远不会得到 aNullRefrenceException因为var1.DataAvailable()永远不会执行 if var1isnull

于 2013-04-09T20:04:18.640 回答
0

没有人提到:

|- 二元或
||- 逻辑或

让我们假设a = false b = true c=false

a || b || c== true
a | b | c== 0 | 1 | 0==1也具有逻辑“真”值。

于 2013-04-10T01:46:42.053 回答