2012-01-25 60 views
0

我讀的源代碼,我發現像這樣的語句:需要解釋,二元運算符|使用布爾類型?

if (Char.IsWhiteSpace(text[i]) | GetSpecialChars.Contains(text[i])) 

起初,我還以爲是筆誤,而不是||(或)運算符。但令我驚訝的是,它被編譯。如何可能?是|相當於||與布爾類型?

在此先感謝。

+0

類似問題[here](http://stackoverflow.com/questions/4838171/difference-between-eager-operation-and-short-circuit-operation-versu-and)and [here](http:///stackoverflow.com/questions/2233835/what-is-the-difference-between-the-and-operators)。 –

+0

[C# - |可能重複和&運營商?](http://stackoverflow.com/questions/8776007/c-sharp-and-operators)專注於埃裏克的頂級答案。 –

回答

4

我認爲這可能是一個錯字,儘管它仍然有效。

原因布爾|是如此罕見之處在於:

  1. 大部分時間||是唯一一個是正確的。如果在右手側的表達式將拋出如果在左手的表達是真實的諸如x == null || x.Length == 0這將成功地返回true爲空或零長度的字符串或陣列而x == null | x.Length == 0這將拋出異常爲空字符串或數組,因爲Length屬性仍將被檢查。
  2. 大部分時間||其餘的會更快。這可能是隻是一對夫婦的時鐘週期快的(儘管它也可能是更多,如果在RHS表達式是昂貴的),但它很難算作一個不成熟的優化,我們都是使用這種形式的習慣。 (只要你付出多少努力來決定哪一個在左邊,哪個在右邊可能是另一個問題)。
  3. ,通過一個在線的球迷使用它的一些結構是相當不明確儘可能readabilty去。

在問題的例子落在下點二。的|而不是||在這裏實踐的唯一影響是浪費幾納秒。這並不重要,但它確實導致||成爲習慣。

(如果另一方面,名爲GetSpecialChars的屬性或稱爲Contains的方法具有意味着必須調用的副作用,則該屬性確實需要重命名以使其更清晰!)。

它唯一有用的時間或者是因爲我們確實需要右手錶達的一些副作用發生,或者在基於它的分配表單中,|=

在前一種情況下,總是值得考慮一種替代方法,即在單獨的語句中對兩個表達式進行評估,然後對結果進行OR操作,使其更清楚地表明您關心的是副作用以及結果。

在後一種情況下,它可以製作更多可讀代碼,或者至少可以編寫更易讀的代碼!但許多人發現它遮蔽了一些東西。

1

沒有錯誤,這是一個布爾運算符OR,而OR ELSE運算符代表||。區別在於,經常的OR不是short-circuit,而OR ELSE呢。

在您的具體情況下,即使Char.IsWhiteSpace(text[i])返回true,也會調用GetSpecialChars.Contains(text[i])。如果您有||替換|,這將不再發生(即GetSpecialChars.Contains(text[i])不會被調用,如果Char.IsWhiteSpace(text[i])true)。

4

|||短路版本。在你的if語句,該GetSpecialChars.Contains方法即使字符是空白,而||將停止評估,而不是執行右側執行。

0

的| 操作者一般有兩個含義與積分用,並用布爾值使用。在第一種情況下,它計算逐位OR的積分而在後一種情況下,與布爾值使用時它計算邏輯OR

第二種情況(在邏輯或情況)帶來了另一個兩種含義:

「|」計算邏輯或與限制它評估兩個值即x | y == false當且僅當x和y都是假的。

「||」做同樣的事情,但只在必要時評估第二個操作數。所以在前面的例子中x ||只要x在沒有看到y的情況下被評估爲真,y就會評估爲真。

您可以直接參考MSDN文檔爲herehere

希望這有助於。