在枚举上覆盖int

时间:2009-02-26 22:19:58

标签: c# .net enums

我看到一些看起来像这样的.NET 2.0代码:

 public enum abc : int
 {
  value1 = 1,
  value2 = 2,
  value3 = 4
 }

等...

现在我知道标志枚举可用于位值(如上所述,对吗?)所以你可以这样做“或”&等等,但不使用它的原因是什么?覆盖int有什么意义?

如果我设计一个用于选择多个值的枚举,我会使用flags属性而不是覆盖任何东西(我不明白)。上述方法是什么网?

由于

7 个答案:

答案 0 :(得分:9)

它不是“覆盖”int,而是指示枚举所基于的类型。默认值为int,因此实际上并没有实现任何效果,但在某些情况下,您可能希望在long上创建枚举以存储更多标志,或者byte以节省空间(如果有)将会有很多enum实例,它只有一些值,但框架设计指南中的建议是使用int,除非你有充分的理由不这样做。

如果这是一个标志枚举,那么它应该用[Flags]标记,这似乎是这里的意图,所以遗漏看起来像是一个错误。您仍然可以使用按位运算符组合值,即使它没有标记为[Flags],但是从内存中我认为您收到编译器警告(或者它可能是FxCop警告,或者可能是ReSharper警告.. )。

答案 1 :(得分:2)

“:int”指定要用作枚举值的基础类型的内容;这里可以使用除char之外的任何整数类型。默认值为int,因此在这种情况下它是多余的。

答案 2 :(得分:2)

FlagsAttribute只告诉用户可以组合此枚举中的字段;它实际上并没有将枚举的字段设置为“可标记”值。这个,你必须自己做,就像你已经做的那样。

答案 3 :(得分:0)

我认为没有任何好处。可能缺乏程序员的经验。

答案 4 :(得分:0)

如果您要求方案选择特定值,我不知道一个好的例子,但我可以想象像

enum Color = {
  Red = 0xFF0000,
  Green = 0x00FF00,
  Blue = 0x0000FF }

可能有用。

答案 5 :(得分:0)

为了使用1-hot编码,将非Flags enum上的值设置为使用1-hot编码实际上没有任何意义。我想如果您认为将来可能会成为Flags enum,那可能会有意义。否则,应该不覆盖这些值或根据其含义赋值(例如,Color.Red = 0xFF0000)。

答案 6 :(得分:0)

在引用指定底层类型的“:int”时,如果我看到它,我会环顾四周,看看他们是否以这种方式对其所有枚举进行了删除。如果是这样,他们可能只是学会用这种方式编写枚举(或者他们可能是超显式编码器)。但是,如果只是这个枚举是以这种方式声明的,也许程序员试图说一些事情(可能更好地用评论说),这对于具有潜在的“int”类型是至关重要的。也许它在某处被二进制序列化或反序列化。

对于[Flags]属性,就C#而言,您可以在任何枚举上使用按位运算符,而不仅仅是使用[Flags]声明的运算符。从上面的示例中,没有任何[Flags],以下内容完全合法:

abc myAbcValue = value1 |值2;

[Flags]的主要区别在于Enum的ToString()和Parse()方法。如果没有[Flags],myAbvValue.ToString()将返回“3”,但是使用[Flags]它将返回“value1,value2”。同样,使用[Flags],

abc yourAbcValue =(abc)Enum.Parse(typeof(abc),“value1,value2”);

会将yourAbcValue的基础值设置为3。

请注意,Enum()的IsDefined()方法不允许使用[Flags]枚举的多个值,因此:

Enum.IsDefined(typeof(abc),“value1,value2”)

无论使用[标志],

都会返回false。

另请注意,[Flags]提供任何反射访问的信息,其他语言可能会对标记枚举的限制与普通枚举不同。