用位运算符代替像OR这样的逻辑运算符可以吗

本文关键字:逻辑运算符 OR 运算符 | 更新日期: 2023-09-27 18:20:14

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

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

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

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

用位运算符代替像OR这样的逻辑运算符可以吗

在布尔表达式(而不是整数等)中,主要区别是:短路。||短路。|没有。在大多数情况下,需要短路,因此||要常见得多。在您的情况下,这并不重要,因此||可能应该被用作更期望的选择。

重要的是:

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

vs:

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

第一个总是同时执行(假设没有抛出异常);如果要求停火,第二个不会发射火箭。

在这种情况下(使用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()) { ... }

这应该有效,因为当用于计算为bool的事物时,"按位"运算符执行的逻辑操作完全相同。不过,你可能会发现它的效率较低。C#中的逻辑运算符会短路,这意味着如果答案可以从第一个表达式推导出来,它们将跳过对第二个表达式的求值。因此,在您的示例中,如果a == null为真,那么||将立即返回true,而|将继续检查b == null

正如所评论的,代码确实是"ok"。

使用单管"|"将在返回结果之前对所有表达式求值。"||"的效率可能更高,因为一旦表达式求值为true,它就会停止。