2014-09-01 75 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反正。