这可能很愚蠢。但我有一个简单的疑问假设我在一个函数中有以下检查
bool Validate(string a , string b)
{
if(a == null || b == null)
{
throw new NullReferenceException();
}
else
{
}
}
是否可以使用位OR进行验证,如下所示
if(a == null | b == null)
在布尔表达式(而不是整数等)中,主要区别是:短路。||
短路。|
没有。在大多数情况下,需要短路,因此||
要常见得多。在您的情况下,这并不重要,因此||
可能应该被用作更期望的选择。
重要的是:
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,它就会停止。