9

通常、フラグ列挙型を比較す​​るときは、次の形式を使用します。

(value & flag) == flag;

しかし、時々私はこれに出くわします:

(value & flag) != 0;

どちらが使いやすいか、それとも個人的な好みの問題でしょうか。

4

4 に答える 4

17

.net 4 以降を使用している場合は、代わりにEnum.HasFlagを使用してください

実際、このメソッドはチェックの最初の方法を使用しますが、フラグをチェックするより明確な方法を提供します

于 2012-11-26T15:32:28.890 に答える
11

flagが 1 ビットのフラグである限り、それらは同等です。flag複数のビットがある場合、

(value & flag) == flag;

は論理積です (すべてのビットが一致する必要があります)。

(value & flag) != 0;

論理 OR です (いずれかのビットが一致する必要があります)。

于 2012-11-26T15:35:01.503 に答える
4

それはちょうど個人的な好みについてです。

2 つのパフォーマンスはほぼ同じになり、結果は常に同じになります。(シングルスレッド環境を想定しています。)

2 番目の例は、もう少し簡単にコピー/貼り付けできると思います。

2 番目の例は、クロス スレッドの問題に対して少し脆弱ではありません (flag式の途中で変更された場合、最初の例で奇妙なことが起こる可能性があります)。

于 2012-11-26T15:32:02.477 に答える
2

0x0111value: 、 flags:などの複合フラグに対して値をチェックしている場合、「すべてのフラグが設定されている」ことを0x0101意味し、 「任意のフラグが設定されている」ことを意味します。(value & flags) == flags(value & flags) != 0

于 2012-11-26T15:35:03.377 に答える