2012-11-26 37 views
9

通常比較標誌枚舉當我使用以下格式:哪種方法比較標誌枚舉更好?

(value & flag) == flag; 

但有時我碰到過這樣的:

(value & flag) != 0; 

只是想知道哪個是更好的使用,或者它歸結爲個人偏愛?

+1

我用單獨的幫助器方法替換了任何這些(包括'Enum.HasFlag')的使用,這些方法產生了更清潔的API使用並減少了代碼重複。請參閱:http://hugoware.net/blog/enumeration-extensions-2-0自從我開始使用Hugo擴展的修改後,事情感覺好多了。 :) –

回答

10

flag是單位標誌,它們是等價的。如果flag有多個位,

(value & flag) == flag; 

是邏輯AND(所有位必須匹配),而

(value & flag) != 0; 

是一個邏輯OR(任何位必須匹配)。

4

這只是關於個人偏好。

兩者的性能大致相同,結果將始終相同。 (假設一個單線程環境。)

第二個示例更容易複製/粘貼我猜。

第二個例子也不太適合跨線程問題(如果flag在表達式中間發生變異,可能會在第一個中發生奇怪的事情)。

16

,如果你使用的是.NET 4或更高的使用Enum.HasFlag代替

其實這種方法使用檢查第一種方式,但提供更清晰的方式只要檢查標誌

+0

這比上面的操作要慢! –

+1

是的,它可能會比較慢,但大多數情況下,它是沒有意義的,如果我們從性能的角度來看清晰的代碼 –

+0

請注意,這種方法等同於原始帖子中的第一行。如果'flag'不是單位值(即不是2的冪,或者對於帶符號的基礎整數不是'MinValue'),那很重要(參見其他答案)。 –

2

如果要檢查對複合標誌值,例如像值:0x0111,國旗:0x0101然後(value & flags) == flags意味着「所有的標誌都設置」,並(value & flags) != 0意味着「任何標誌設置」。

+0

Upvoted,但你應該編輯放入需要的圓括號。 –