通常、フラグ列挙型を比較するときは、次の形式を使用します。
(value & flag) == flag;
しかし、時々私はこれに出くわします:
(value & flag) != 0;
どちらが使いやすいか、それとも個人的な好みの問題でしょうか。
通常、フラグ列挙型を比較するときは、次の形式を使用します。
(value & flag) == flag;
しかし、時々私はこれに出くわします:
(value & flag) != 0;
どちらが使いやすいか、それとも個人的な好みの問題でしょうか。
.net 4 以降を使用している場合は、代わりにEnum.HasFlagを使用してください
実際、このメソッドはチェックの最初の方法を使用しますが、フラグをチェックするより明確な方法を提供します
flag
が 1 ビットのフラグである限り、それらは同等です。flag
複数のビットがある場合、
(value & flag) == flag;
は論理積です (すべてのビットが一致する必要があります)。
(value & flag) != 0;
論理 OR です (いずれかのビットが一致する必要があります)。
それはちょうど個人的な好みについてです。
2 つのパフォーマンスはほぼ同じになり、結果は常に同じになります。(シングルスレッド環境を想定しています。)
2 番目の例は、もう少し簡単にコピー/貼り付けできると思います。
2 番目の例は、クロス スレッドの問題に対して少し脆弱ではありません (flag
式の途中で変更された場合、最初の例で奇妙なことが起こる可能性があります)。
0x0111
value: 、 flags:などの複合フラグに対して値をチェックしている場合、「すべてのフラグが設定されている」ことを0x0101
意味し、 「任意のフラグが設定されている」ことを意味します。(value & flags) == flags
(value & flags) != 0