如果按顺序声明[Flags]枚举会怎样?

时间:2014-03-31 06:47:12

标签: c# enum-flags

我遇到过这个问题:What does the [Flags] Enum Attribute mean in C#?

有一件事我想知道,使用接受的answer's example,如果我宣布会发生什么:

[Flags]
public enum MyColors
{
    Yellow = 1,
    Green = 2,
    Red = 3,
    Blue = 4
}

该示例中的以下步骤会导致错误吗?如果不是,我怎样才能进入MyColors.Red?

5 个答案:

答案 0 :(得分:9)

Flags属性实际上并没有做任何事情来枚举它自己或影响它在代码中的使用方式。 Flags属性唯一影响的是ToString方法的输出。 Flags属性的另一个目的是向开发人员指明他们应该如何使用枚举。你的例子不会导致任何错误;这只是愚蠢的代码。规则很简单:

  1. 如果一次只应该使用一个值,则不要应用Flags属性并为该类型使用单数名称。
  2. 如果可以同时使用多个值,则应用Flags属性,对值使用2的幂,并为该类型使用复数名称。

答案 1 :(得分:3)

要详细说明jdphenix的答案,请记住[Flags]属性实际上并没有做任何魔法。它只是在枚举上添加了一个纯粹的化妆标记,它允许其他函数(默认情况下,只有枚举的ToString实现)将枚举视为Flags枚举。

无论属性如何,枚举仍然只是一个数字,默认情况下是一个Int32,周围有一些语法糖。因此,如果你像你一样定义你的枚举,那么

MyColors newColor = MyColors.Yellow | MyColors.Green 

只会在1和2上执行按位OR运算。按位枚举的魔力不在属性中,但是2的幂允许您切换""切换"一点点打开和关闭。使用序数将关闭作为多于一个枚举值的二进制表示的一部分的位,使得按位运算的结果毫无意义。

答案 2 :(得分:1)

它不会按预期运行。对于每个枚举常量的声明值,必须使用2的幂。以下是您链接的答案中的示例:

[Flags]
public enum MyColors
{
    Yellow = 1,
    Green = 2,
    Red = 4,
    Blue = 8
}

如果声明的值不是2的幂:

  • 您将无法执行有意义的按位操作。
  • 您可以将它用于普通枚举(不会出现编译错误)。

答案 3 :(得分:1)

所有[Flags]属性都允许您将按位运算符应用于枚举。

[编辑是正确的 - 如果你没有指定[Flags],甚至没有警告 - 我本来可以发誓它曾经像这样......]

您拥有的= 3(红色)非常有用,因为您可以定义要检查的组合......在您的示例中:

[Flags]
public enum MyColors
{
    Yellow = 1,
    Green = 2,
    YellowAndGreen = 3,
    Blue = 4
}

现在,显然这是一个愚蠢的例子,但请考虑以下内容:

[Flags]
public enum MyStuff
{
    HasCar = 1,
    HasDog = 2,
    HasKids = 4,
    HasEverything = 7,
}

现在,要检查变量是否包含所有内容,您可以执行以下操作:

return (myStuff & MyStuff.HasEverything) == MyStuff.HasEverything;

答案 4 :(得分:1)

会导致意外结果。使唯一性的常见做法只是标记枚举值为2的幂。

例如,Yellow按位或Green会产生Red,依此类推。

MyColors colors = MyColors.Yellow | MyColors.Green;
if (colors == MyColors.Red)
{
    Console.WriteLine("Oops!")
}

另请注意Flags属性在此处不执行任何操作,它给人的印象是您可以使用按位或