是否可以使用ONE-Liner(正常方式......)检查是否设置了所有可能的枚举状态?
从enum水果中我想知道它是不是意味着没有香蕉,没有苹果,没有甜瓜。
我该怎么做?
答案 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
答案 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
,其值为0
或0x0
。这样,任何类型为枚举Fruit
的“非设置”成员都可以设置为Fruit.None
的默认值。
public enum Fruit
{
None,
Banana,
Apple,
Kumquat,
}
和
public class Meal
{
Fruit myFruit = Fruit.None;
}