【问题标题】:Simple way of checking if one of three booleans are true [closed]检查三个布尔值之一是否为真的简单方法[关闭]
【发布时间】:2013-04-09 19:24:16
【问题描述】:

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

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

【问题讨论】:

  • I can tell it only checks the first two variables,如果其中一个为真,则无需检查第三个(在您的情况下第二个为真):)
  • 没有。它首先检查 var1 是否为真,如果不是,则检查 var2 是否为真,否则检查 var3。这称为短路,这正是您在问题标题中想要的。
  • OP,您的意思是,如果只有三个中的一个为真,而不是 2 或 3 个为真,您是否只希望语句评估为真?
  • 不,我可以评估其中一个或多个是否为真。
  • 那你已经做对了。

标签: c# .net boolean


【解决方案1】:

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

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

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

使用方法可能是:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      ||&& 运算符是所谓的“短路”运算符,如果它找到满足其需求的条件,它将停止检查其他元素(它为 || 找到的第一个 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,因为如果var1nullvar1.DataAvailable() 永远不会执行

      【讨论】:

        【解决方案4】:

        没有人提到:

        | - 二进制 OR
        || - 逻辑 OR

        假设a = false b = true c=false

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

        【讨论】:

          猜你喜欢
          • 2019-05-22
          • 2012-05-06
          • 2011-03-05
          • 2016-09-19
          • 2021-11-14
          • 2018-03-31
          • 2019-08-07
          • 2023-03-17
          • 1970-01-01
          相关资源
          最近更新 更多