这可能是愚蠢的。但我有一个简单的疑问 假设我在函数中有以下检查
bool Validate(string a , string b)
{
if(a == null || b == null)
{
throw new NullReferenceException();
}
else
{
}
}
可以使用按位OR进行验证,如下所示
if(a == null | b == null)
答案 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)
正如已经评论过的那样,代码确实是“好的”。
使用单管'|'将在返回结果之前评估所有表达式。 '||'可以更高效,因为只要表达式求值为真,它就会停止。