flagsattribute - отрицательные значения? - PullRequest
1 голос
/ 15 сентября 2009

У меня есть перечисление с атрибутом flags, которое я использую для представления разрешений. Я использую его для сравнения if (CurrentPermissions & Permission1 == Permission1) и т.д ...

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

}

Однако мы достигли максимального предела. Могу ли я использовать отрицательные значения, такие как -1, -2, -4 и т. Д., Когда у меня заканчиваются значения enum?

Ответы [ 2 ]

2 голосов
/ 29 декабря 2009

Вы можете определять записи с любыми значениями в перечислении Flags. Два общих из них будут равны нулю и 0xffffffff (-1), поскольку они могут быть полезными значениями для представления значений «все опции отключены» и «все опции включены», например

enum DrawingOptions
{
   None         = 0,

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

   BestQuality  = 0xffffffff
}

(Если вы добавите новую опцию, любой код, который включил «BestQuality», автоматически включит эту опцию, поэтому вам не придется искать код, чтобы обновить все)

Однако отрицательные числа, отличные от -1, вряд ли будут очень полезны, поскольку Фрэнк Боллак уже ответил.

Возможно, вам также придется быть осторожным с отрицательными числами при изменении размера вашего перечисления (byte, int32, int64).

1 голос
/ 15 сентября 2009

Поскольку FlagsAttribue предназначен для обозначения вашего перечисления как битового поля, использование отрицательного числа не имеет большого смысла. Посмотрите на двоичное представление (для int16):

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

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

Как видите, отрицательные значения перечисления будут вести себя как побитовая комбинация положительных значений. Принимая int32 в качестве основы для перечислений, у вас есть только 32 различных значения. Таким образом, существует максимум 64 значения, использующих long (int64) в качестве основы для вашего перечисления.

Если вы превысите это число, возможно, лучше подойдет другая структура данных, например, список значений перечисления.

...