我讀的源代碼,我發現像這樣的語句:需要解釋,二元運算符|使用布爾類型?
if (Char.IsWhiteSpace(text[i]) | GetSpecialChars.Contains(text[i]))
起初,我還以爲是筆誤,而不是||
(或)運算符。但令我驚訝的是,它被編譯。如何可能?是|相當於||與布爾類型?
在此先感謝。
我讀的源代碼,我發現像這樣的語句:需要解釋,二元運算符|使用布爾類型?
if (Char.IsWhiteSpace(text[i]) | GetSpecialChars.Contains(text[i]))
起初,我還以爲是筆誤,而不是||
(或)運算符。但令我驚訝的是,它被編譯。如何可能?是|相當於||與布爾類型?
在此先感謝。
我認爲這可能是一個錯字,儘管它仍然有效。
原因布爾|
是如此罕見之處在於:
||
是唯一一個是正確的。如果在右手側的表達式將拋出如果在左手的表達是真實的諸如x == null || x.Length == 0
這將成功地返回true爲空或零長度的字符串或陣列而x == null | x.Length == 0
這將拋出異常爲空字符串或數組,因爲Length
屬性仍將被檢查。||
其餘的會更快。這可能是隻是一對夫婦的時鐘週期快的(儘管它也可能是更多,如果在RHS表達式是昂貴的),但它很難算作一個不成熟的優化,我們都是使用這種形式的習慣。 (只要你付出多少努力來決定哪一個在左邊,哪個在右邊可能是另一個問題)。在問題的例子落在下點二。的|
而不是||
在這裏實踐的唯一影響是浪費幾納秒。這並不重要,但它確實導致||
成爲習慣。
(如果另一方面,名爲GetSpecialChars
的屬性或稱爲Contains
的方法具有意味着必須調用的副作用,則該屬性確實需要重命名以使其更清晰!)。
它唯一有用的時間或者是因爲我們確實需要右手錶達的一些副作用發生,或者在基於它的分配表單中,|=
。
在前一種情況下,總是值得考慮一種替代方法,即在單獨的語句中對兩個表達式進行評估,然後對結果進行OR操作,使其更清楚地表明您關心的是副作用以及結果。
在後一種情況下,它可以製作更多可讀代碼,或者至少可以編寫更易讀的代碼!但許多人發現它遮蔽了一些東西。
沒有錯誤,這是一個布爾運算符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
)。
||
是|
短路版本。在你的if語句,該GetSpecialChars.Contains
方法即使字符是空白,而||
將停止評估,而不是執行右側執行。
類似問題[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)。 –
[C# - |可能重複和&運營商?](http://stackoverflow.com/questions/8776007/c-sharp-and-operators)專注於埃裏克的頂級答案。 –