是否可以使用按位运算符代替OR之类的逻辑运算符

时间:2014-09-01 08:52:59

标签: c# logical-operators

这可能是愚蠢的。但我有一个简单的疑问 假设我在函数中有以下检查

bool Validate(string a , string b)
{
    if(a == null || b == null)
    {
        throw new NullReferenceException();
    }
    else
    {
    }
}

可以使用按位OR进行验证,如下所示

if(a == null | b == null)

4 个答案:

答案 0 :(得分:9)

在布尔表达式(而不是整数等)中,主要区别在于:短路。 ||短路。 |没有。在大多数情况下,您想要短路,因此||更为常见。在你的情况下,它不重要,所以||应该被用作更期望的选择。

重要的时间是:

if(politics.IsCeasefire() | army.LaunchTheRockets()) {
    // ...
}

VS

if(politics.IsCeasefire() || army.LaunchTheRockets()) {
    // ...
}

第一个始终同时执行(假设没有抛出异常);如果停火被召唤,第二个不会发射火箭。

答案 1 :(得分:1)

在这种情况下(带bool个参数),|运算符不是按位运算符。它只是逻辑or||)的非短路版本。

&&&的情况相同 - 它只是逻辑and的非短路版本。

可以看到副作用的差异,例如在

bool Check()
{
    Console.WriteLine("Evaluated!");
    return true;
}

// Short-circuits, only evaluates the left argument.
if (Check() || Check()) { ... }

// vs.

// No short circuit, evaluates both.
if (Check() | Check()) { ... }

答案 2 :(得分:1)

这应该可行,因为当用于评估为bool的事物时,“按位”运算符执行逻辑运算。但是,您可能会发现效率较低。 C#中的逻辑运算符将短路,这意味着如果可以从第一个表达式中推断出答案,则它们将跳过对第二个表达式的求值。因此,在您的示例中,如果a == null结果为真,那么||会立即返回true,而|会继续,并检查b == null

答案 3 :(得分:0)

正如已经评论过的那样,代码确实是“好的”。

使用单管'|'将在返回结果之前评估所有表达式。 '||'可以更高效,因为只要表达式求值为真,它就会停止。