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

本文关键字:枚举 设置 是否 检查 | 更新日期: 2023-09-27 18:02:18

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

从列举的水果中,我想知道它是不是没有香蕉,没有苹果,没有甜瓜。

我该怎么做?

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

会:

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");

它做了你期望的事情,但它是检查下属值,而不是按位操作,所以如果你错误地改变下属值,你就会开始遇到问题,但你也会遇到其他问题。

给定:

[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");

也有行为。

[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

假设您谈论的是一个设置为位标志的枚举,MSDN有一个很好的例子:

[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;

理论上,根据您的意图,您可以将所有按位操作放在一行上,用&|分隔。

我建议枚举包含一个默认的"非集合"成员,例如值为00x0Fruit.None。这样,任何类型为枚举Fruit的"非集合"成员都可以设置为默认Fruit.None

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

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