操作员的问题&&;

本文关键字:amp 问题 操作员 | 更新日期: 2023-09-27 17:59:03

考虑以下代码

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

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

操作员的问题&&;

尝试使用:

GetFalse() & GetTrue()

不能,因为逻辑AND运算符短路。在一般情况下,避免类似表达式的副作用是一个好主意,尽管有完全有效的用法(即if( someObj != null && someObj.Value == whatever ))。你可以使用不会短路的按位和运算符(&),但我不会这么做。

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

bool first = SomeMethodCall();
bool second = SomeMethodThatMustExecute();
if( first && second )
{
    // ...
}

使用非短路版本(不使用布尔值时也称为逐位AND):

GetFalse() & GetTrue();

这是一个优化问题。由于表达式中调用的第一个方法为false,因此整个表达式不可能为true,因此不调用表达式中的第二个方法。如果有必要将其称为副作用(依赖副作用的不良做法,但YMMV),则应使用类似的东西:

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

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

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

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