编辑:似乎大多数人误解了我的问题。
我知道枚举是如何工作的,而且我知道二进制。我想知道为什么带有 [Flags] 属性的枚举是这样设计的。
原帖:
这可能是重复的,但我没有找到任何其他帖子,所以这里。
我敢打赌,它背后有一些很好的理由,我只是觉得它有点容易出错。
[Flag]
public enum Flagged
{
One, // 0
Two, // 1
Three, // 2
Four, // 3
}
Flagged f; // Defaults to Flagged.One = 0
f = Flagged.Four;
(f & Flagged.One) != 0; // Sure.. One defaults to 0
(f & Flagged.Two) != 0; // 3 & 1 == 1
(f & Flagged.Three) != 0; // 3 & 2 == 2
如果它做这样的事情不是更有意义吗?
[Flag]
public enum Flagged
{
One = 1 << 0, // 1
Two = 1 << 1, // 2
Three = 1 << 2, // 4
Four = 1 << 3, // 8
}
Flagged f; // Defaults to 0
f = Flagged.Four;
(f & Flagged.One) != 0; // 8 & 1 == 0
(f & Flagged.Two) != 0; // 8 & 2 == 0
(f & Flagged.Three) != 0; // 8 & 4 == 0
(f & Flagged.Four) != 0; // 8 & 8 == 8
当然..我不太确定它应该如何处理这样的自定义标志
[Flag]
public enum Flagged
{
One, // 1
Two, // 2
LessThanThree = One | Two,
Three, // 4? start from Two?
LessThanFour = Three | LessThanThree,
Three, // 8? start from Three?
}
该规范给出了一些指导方针
以 2 的幂定义枚举常数,即 1、2、4、8 等。这意味着组合枚举常量中的各个标志不重叠。
但这也许应该自动完成,因为我敢打赌你永远不会希望我的第一个例子出现。请赐教:)