检查三个布尔值中是否有一个为真的简单方法

本文关键字:有一个 是否 真的 方法 简单 布尔值 三个 检查 | 更新日期: 2023-09-27 18:08:13

我试过使用下面的代码,但据我所知,它只检查前两个变量。

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

检查三个布尔值中是否有一个为真的简单方法

如果需要计算这三个值,您可以使用:

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

。有这样的需求似乎很奇怪,但假设这三个属性的getter都有副作用…

对于方法,它可以是:

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

在任何情况下都调用这三个方法

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

var1 || var2 || var3
如果var1, var2和var3中的任何一个为真,

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

我觉得其他的答案已经涵盖了你需要做的事情,但是我想对正在发生的事情给出一个更好的解释。

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

so in effect

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();

短路的一个非常有用的实际应用是在调用成员或方法之前检查是否为空。在下面的示例中,假设var1是一个可能为空的变量,并且需要在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()永远不会执行,如果var1null

没有人提到:

| -二进制或
|| -逻辑或

假设a = false b = true c=false

a || b || c == true
a | b | c == 0 | 1 | 0 == 1,也有逻辑上的"true"值

相关文章: