2014-09-01 46 views
1

这可能stupid.but我有一个简单的疑问 假设我有一个函数它是确定使用位运算符来代替像或逻辑运算符

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

以下检查是否确定使用按位或进行验证,如下所示

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

你试过了吗?编译 – Sayse 2014-09-01 08:53:38

+0

这是否有用?是的,但不知道它是否正确 – 2014-09-01 08:54:46

+5

与'bool'值一起使用时,'|'不是**是一个按位运算符 - 比较。 [docs](http://msdn.microsoft.com/en-us/library/kxszd0kx.aspx):“对于bool操作数,|计算其操作数的逻辑OR” – 2014-09-01 08:55:26

回答

9

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

它很重要的时间是:

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

VS:

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

第一总是这样既(假设没有抛出异常);如果停火被叫,第二个不会发射火箭。

+0

这是一个很好的..谢谢我现在得到它 – 2014-09-01 09:01:17

+1

火箭队是最好的副作用的例子:) – 2014-09-01 09:02:31

+0

就个人而言,在这种情况下,我宁愿'if(!politics.IsCeasefire()){army.LaunchTheRockets();}'。不包括memoization之类的东西,我不喜欢隐藏我的条件的副作用。 – Brian 2014-09-02 13:13:55

0

为对已注释,代码确实是“OK”。

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

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()) { ... } 
1

这应该工作,因为对事物的计算结果为bool使用时,“按位”经营者进行逻辑运算一样的。不过,您可能会发现效率较低。 C#中的逻辑运算符会短路,这意味着如果答案可以从第一个表达式推导出来,它们将跳过对第二个表达式的评估。因此,在你的榜样,如果a == null证明是真实的,那么||将立即返回true,而|会继续和检查b == null反正。