3

我有一个带有标志属性的枚举,我用它来表示权限。我用它来比较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 枚举中使用您喜欢的任何值定义条目。两个常见的值是 0 和 0xffffffff (-1),因为它们可能是表示“禁用所有选项”和“启用所有选项”值的有用值,例如

enum DrawingOptions
{
   None         = 0,

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

   BestQuality  = 0xffffffff
}

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

但是,-1 以外的负数不太可能很有用,正如 Frank Bollack 已经回答的那样。

当您的枚举(字节、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 个不同的值可用。因此,最多有 64 个值使用 long(int64) 作为枚举的基础。

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

于 2009-09-15T08:47:25.770 回答