【问题标题】:Problem with operator &&运算符 && 的问题
【发布时间】:2011-06-14 15:47:35
【问题描述】:

考虑以下代码

    public bool GetFalse()
    {
        return false;
    }
    public bool GetTrue()
    {
        return true;
    }

如何强制这个表达式GetFalse() && GetTrue() 执行第二个方法?

【问题讨论】:

  • 您正在使用短路的and 运算符,因此一旦无法计算为true,表达式就会失败。你想完成什么?
  • 我建议不要同时依赖两者来执行。如果两者都需要执行,听起来实际的 GetFalse() 或 GetTrue() 有一些副作用。
  • @jglouie:同意。如果它们都需要执行,那么您应该单独调用它们并稍后检查结果。

标签: c# operators


【解决方案1】:

尝试:

GetFalse() & GetTrue()

【讨论】:

  • 我不建议实际这样做(即使它回答了问题)。只需分别调用它们即可。
【解决方案2】:

你不能因为逻辑 AND 运算符短路。在一般情况下,最好避免此类表达式的副作用,尽管有完全有效的用途(即if( someObj != null && someObj.Value == whatever )。您可以使用不会短路的按位和运算符(&),但是再说一次,我不会那样做的。

您应该先将这两个方法调用拆分为变量,然后执行检查是否需要它们都执行。

bool first = SomeMethodCall();
bool second = SomeMethodThatMustExecute();

if( first && second )
{
    // ...
}

【讨论】:

  • 但是不会短路。
  • @blowdart:是的,我在编辑。这里总是一场比赛:)。不过可能不应该那样做。
  • 如果您拆分调用(而不是使用&),那么阅读该代码的其他人(或者您,在几个月内)将看到这两种方法总是被调用。您不必记住&&& 之间的区别。
【解决方案3】:

使用非短路版本(在不使用布尔值时也称为按位与):

GetFalse() & GetTrue();

【讨论】:

    【解决方案4】:

    这是一个优化问题。由于表达式中调用的第一个方法为假,整个表达式不可能为真,所以表达式中的第二个方法没有被调用。如果有必要将其称为副作用(依赖副作用的坏习惯,但是 YMMV),应该使用这样的东西:

    x = GetFalse(); 
    y = GetTrue(); 
    if (x && y) ...
    

    【讨论】:

      【解决方案5】:

      假设您的实际函数执行某些特定任务并返回一个指示(例如)成功或失败的值,我希望将其写成

      bool fooResult = DoFoo();
      bool barResult = DoFar();
      

      然后你可以在你的代码中使用fooResult && barResult

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-24
        • 2015-07-25
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 2011-10-20
        • 1970-01-01
        相关资源
        最近更新 更多