编辑:似乎大多数人都误解了我的问题。
我知道枚举是如何工作的,我也知道二进制。我想知道为什么具有 [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?
}
规范给出了一些指导方针
Define enumeration constants in powers of two, that is, 1, 2, 4, 8, and so on. This means the individual flags in combined enumeration constants do not overlap.
但这也许应该自动完成,因为我敢打赌您永远不会希望我的第一个示例出现。请赐教:)
最佳答案
Flags
属性仅用于将值格式化为多个值。位操作在有或没有属性的基础类型上工作。
关于c# - 为什么 [Flag] 的枚举从 0 开始并递增 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3112193/