3

権限を表すために使用する flagsattribute を持つ列挙型があります。比較if (CurrentPermissions & Permission1 == Permission1)などに使っています。

[FlagsAttribute]
enum MyPermission
{
  None = 0,
  Permission1 = 1,
  Permission2 = 2,
  Permission3 = 4,
  Permission4 = 8,...
  ..................
  and so on

}

ただし、上限に達します。列挙値を使い果たしたら、-1、-2、-4 などの負の値を使用できますか?

4

2 に答える 2

3

Flags 列挙内で任意の値を使用してエントリを定義できます。2 つの一般的なものは、ゼロと 0xffffffff (-1) です。これらは、「すべてのオプションが無効」および「すべてのオプションが有効」の値を表すのに役立つ値だからです。

enum DrawingOptions
{
   None         = 0,

   DrawLines    = 1 << 0,
   FillShapes   = 1 << 1,
   Antialias    = 1 << 2,

   BestQuality  = 0xffffffff
}

(新しいオプションを追加すると、「BestQuality」を有効にしたコードは自動的にそのオプションが有効になるため、すべてを更新するためにコードを検索する必要はありません)

ただし、Frank Bollack が既に回答しているように、-1 以外の負の数はあまり役に立ちそうにありません。

列挙型 (byte、int32、int64) のサイズが変更された場合は、負の数にも注意する必要があります。

于 2009-12-28T22:27:10.223 に答える
2

FlagsAttribueは、列挙をビットフィールドとしてマークすることを目的としているため、負の数を使用してもあまり意味がありません。バイナリ表現(int16の場合)を見てください。

 1 -> 0000000000000001b
 2 -> 0000000000000010b
 4 -> 0000000000000100b

-1 -> 1111111111111111b
-2 -> 1111111111111110b
-4 -> 1111111111111100b

ご覧のとおり、負の列挙値は正の値のビット単位の組み合わせとして動作します。列挙型ベースとしてint32を使用すると、32個の異なる値しか使用できません。したがって、列挙のベースとしてlong(int64)を使用すると、最大64個の値があります。

この数を超える場合は、列挙値のリストなど、別のデータ構造の方が適している可能性があります。

于 2009-09-15T08:47:25.770 に答える