flagsattribute - 负值?

时间:2009-09-15 05:13:04

标签: .net flags

我有一个带有flagsattribute的枚举,我用它来表示权限。我用它来比较if (CurrentPermissions & Permission1 == Permission1)等......

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

}

但是,我们达到了最大限度。一旦我用完枚举值,我可以使用-1,-2,-4等负值吗?

2 个答案:

答案 0 :(得分:2)

您可以在Flags枚举中使用您喜欢的任何值定义条目。两个常见的是零和0xffffffff(-1),因为它们可以是有用的值来表示“禁用所有选项”和“启用所有选项”值,例如

enum DrawingOptions
{
   None         = 0,

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

   BestQuality  = 0xffffffff
}

(如果添加新选项,任何启用“BestQuality”的代码都会自动启用该选项,因此您无需搜索代码即可更新所有内容)

然而,除了-1以外的负数不太可能非常有用,正如Frank Bollack已经回答的那样。

当枚举(byte,int32,int64)的大小发生变化时,您可能还需要非常小心负数。

答案 1 :(得分:1)

由于FlagsAttribue旨在将您的输入标记为位字段,因此使用负数将没有多大意义。查看二进制表示(对于int16):

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

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

如您所见,负枚举值将表现为正值的按位组合。以int32作为枚举基础,您只有32个不同的值可用。因此,使用long(int64)作为枚举的基础,最多有64个值。

如果你超过这个数字,可能另一个数据结构更合适,例如枚举值列表。