4

同時に存在できる複数の値を持つ列挙型がある場合は、Flags列挙型を作成します。

[Flags]
public enum Foo
{
    None = 0,
    A = 1,
    B = 2,
    C = 4,
    D = 8
}

すべての値が設定されているという事実を伝えたい場合は、次のようにする必要があります。

Bar bar = new Bar(Foo.A | Foo.B | Foo.C | Foo.D);

すべての要素を追加することは、悪い習慣/有害/冒涜と見なされますか?

    All = 15

これにより、値が多く、すべてを渡すことが一般的なシナリオである場合に、スペースと時間を節約できます。

フラグ列挙型(=ビットフィールド)の仕組みを理解している限り、これは機能するはずです。私が見逃している副作用や、それをすべきでない他の理由はありますか?

4

4 に答える 4

8

出来るよ。しかし、多分あなたは値15を使うべきではありませんが

All = A | B | C | D
于 2012-05-29T21:31:16.240 に答える
2

ここには危険な落とし穴があります。すべてを変更しても、呼び出し元のコンポーネントが再コンパイルされない場合、古いすべてが送信されます。これで問題がなければ、それでいいのです。

于 2012-05-29T21:31:41.947 に答える
1

ビット演算を使用すると、はるかに読みやすくなります

[Flags]
public enum MyEnum
{
    None   = 0,
    First  = 1 << 0,
    Second = 1 << 1,
    Third  = 1 << 2,
    Fourth = 1 << 3,
    All = ~(-1 << 4)
}
于 2014-04-22T16:43:15.930 に答える
0

これがうまくいかない可能性が最も高い場所は

[Flags]
public enum Foo
{
    None = 0,
    A = 1,
    B = 2,
    C = 4,
    D = 8
    E = 16
    All = 15
}

私たちのプロペラヘッドはマイクロフォーカスされる傾向があり、Eの仕事が追加されました。おっと、ああ、親愛なる、くそー....

そして、Allのアイデアをさらに一歩進めて、AllbutCの必要性を感じます。

于 2012-05-29T21:49:14.247 に答える