我尝试使用以下代码,但据我所知,它只检查前两个变量。
if (var1 || var2 || var3)
{
// Do something.
}
答案 0 :(得分:3)
如果您需要来评估所有三个,您可以使用:
if (var1 | var2 | var3)
{
// Do something.
}
代替。有这样的需要似乎很奇怪,但假设这三个都是吸气剂有副作用的属性......
使用方法可能是:
if (DoWork() | DoDuties() | DoFinalStuff())
{
// At least one method returned true ("success")
}
无论如何都要调用这三种方法。
答案 1 :(得分:3)
您的代码正在检查三个变量之一是否为真,即
var1 || var2 || var3
如果var1,var2和var3中的任何一个为真,则为真。这里唯一的subtelty是使用短路逻辑执行实际检查:如果var1为真,则无需检查var2和var3等。
答案 2 :(得分:2)
我觉得其他答案已经涵盖了你需要做的事情,但我想更好地解释发生了什么。
||
或&&
运算符是所谓的“短路”运算符,如果找到满足其需求的条件,它就会停止检查其他元素(它找到的第一个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()
为真时执行操作。例如
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
}
}
由于短暂停留,您永远不会获得NullRefrenceException
,因为如果var1.DataAvailable()
为var1
null
永远不会执行
答案 3 :(得分:0)
没有人提到:
|
- 二进制OR
||
- 逻辑OR
让我们假设a = false
b = true
c=false
a || b || c
== true
a | b | c
== 0 | 1 | 0
== 1
也具有逻辑“真实”值。