检查是否未设置所有枚举值
本文关键字:枚举 设置 是否 检查 | 更新日期: 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;
理论上,根据您的意图,您可以将所有按位操作放在一行上,用&
或|
分隔。
我建议枚举包含一个默认的"非集合"成员,例如值为0
或0x0
的Fruit.None
。这样,任何类型为枚举Fruit
的"非集合"成员都可以设置为默认Fruit.None
。
public enum Fruit
{
None,
Banana,
Apple,
Kumquat,
}
和
public class Meal
{
Fruit myFruit = Fruit.None;
}