通常比較標誌枚舉當我使用以下格式:哪種方法比較標誌枚舉更好?
(value & flag) == flag;
但有時我碰到過這樣的:
(value & flag) != 0;
只是想知道哪個是更好的使用,或者它歸結爲個人偏愛?
通常比較標誌枚舉當我使用以下格式:哪種方法比較標誌枚舉更好?
(value & flag) == flag;
但有時我碰到過這樣的:
(value & flag) != 0;
只是想知道哪個是更好的使用,或者它歸結爲個人偏愛?
爲flag
是單位標誌,它們是等價的。如果flag
有多個位,
(value & flag) == flag;
是邏輯AND(所有位必須匹配),而
(value & flag) != 0;
是一個邏輯OR(任何位必須匹配)。
這只是關於個人偏好。
兩者的性能大致相同,結果將始終相同。 (假設一個單線程環境。)
第二個示例更容易複製/粘貼我猜。
第二個例子也不太適合跨線程問題(如果flag
在表達式中間發生變異,可能會在第一個中發生奇怪的事情)。
,如果你使用的是.NET 4或更高的使用Enum.HasFlag代替
其實這種方法使用檢查第一種方式,但提供更清晰的方式只要檢查標誌
這比上面的操作要慢! –
是的,它可能會比較慢,但大多數情況下,它是沒有意義的,如果我們從性能的角度來看清晰的代碼 –
請注意,這種方法等同於原始帖子中的第一行。如果'flag'不是單位值(即不是2的冪,或者對於帶符號的基礎整數不是'MinValue'),那很重要(參見其他答案)。 –
如果要檢查對複合標誌值,例如像值:0x0111
,國旗:0x0101
然後(value & flags) == flags
意味着「所有的標誌都設置」,並(value & flags) != 0
意味着「任何標誌設置」。
Upvoted,但你應該編輯放入需要的圓括號。 –
我用單獨的幫助器方法替換了任何這些(包括'Enum.HasFlag')的使用,這些方法產生了更清潔的API使用並減少了代碼重複。請參閱:http://hugoware.net/blog/enumeration-extensions-2-0自從我開始使用Hugo擴展的修改後,事情感覺好多了。 :) –