检查是否未设置所有枚举值

时间:2011-07-14 13:32:54

标签: c# enums flags

是否可以使用ONE-Liner(正常方式......)检查是否设置了所有可能的枚举状态?

从enum水果中我想知道它是不是意味着没有香蕉,没有苹果,没有甜瓜。

我该怎么做?

4 个答案:

答案 0 :(得分:6)

将:

myFlags == 0

就够? 0表示没有设置位,假设您正在使用标志而没有对值进行任何简单的操作。

鉴于此枚举:

[Flags]
enum Fruit
{
    Forbidden = 0,
    Apple = 1,
    Orange = 2,
    Banana = 4
}

这段代码:

Fruit f = Fruit.Apple | Fruit.Banana;

if (f == 0)
    MessageBox.Show("what?");

f = Fruit.Forbidden;

if (f == 0)
    MessageBox.Show("expected");

它完成了你所期望的,但它检查底层值没有按位操作,所以如果你错误地改变底层值你会开始遇到问题,但你也会遇到其他问题。 / p>

假设:

[Flags]
enum Fruit
{
    Apple = 1,
    Orange = 2,
    Banana = 4
}

Fruit f = Fruit.Apple | Fruit.Banana;

if (f == 0)
    MessageBox.Show("what?");

f = f & ~Fruit.Apple & ~Fruit.Banana;

if (f == 0)
    MessageBox.Show("expected");

也表现出来。

答案 1 :(得分:4)

[Flags]
enum Fruit
{
    None,
    Apple  /* = 1*/,
    Orange    = Apple << 1,
    Banana    = Orange << 1,

    All       = (Banana << 1) -1
}

这样你就可以检查是否

  • 没有设置水果标志:value == Fruit.None
  • 设置所有水果标志:value == Fruit.All
  • 设置了非法水果值:(value & ~Fruit.All) != 0

IdeOne

上查看

答案 2 :(得分:1)

假设您正在讨论设置为Bit Flags的枚举,MSDN has a good example

[Flags]
enum Days2
{
    None = 0x0,
    Sunday = 0x1,
    Monday = 0x2,
    Tuesday = 0x4,
    Wednesday = 0x8,
    Thursday = 0x10,
    Friday = 0x20,
    Saturday = 0x40
}

检查是否设置了位标志,例如可以这样做:

// Test value of flags using bitwise AND.
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;

理论上,您可以将所有按位操作放在由&|分隔的一行上,具体取决于您的意图。

答案 3 :(得分:1)

我建议枚举包含默认的“非设置”成员,例如Fruit.None,其值为00x0。这样,任何类型为枚举Fruit的“非设置”成员都可以设置为Fruit.None的默认值。

public enum Fruit
{
    None,
    Banana,
    Apple,
    Kumquat,
}

public class Meal
{
    Fruit myFruit = Fruit.None;
}