我看到一些看起来像这样的.NET 2.0代码:
public enum abc : int
{
value1 = 1,
value2 = 2,
value3 = 4
}
等...
现在我知道标志枚举可用于位值(如上所述,对吗?)所以你可以这样做“或”&等等,但不使用它的原因是什么?覆盖int有什么意义?
如果我设计一个用于选择多个值的枚举,我会使用flags属性而不是覆盖任何东西(我不明白)。上述方法是什么网?
由于
答案 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]提供任何反射访问的信息,其他语言可能会对标记枚举的限制与普通枚举不同。