c# - 为什么 [Flag] 的枚举从 0 开始并递增 1?

标签 c# enums bitflags

编辑:似乎大多数人都误解了我的问题。

我知道枚举是如何工作的,我也知道二进制。我想知道为什么具有 [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/

相关文章:

c# - 随机一组 float 的最佳排序算法是什么?

c# - .Net (Windows Forms) 用户控件的点击事件

比较可变枚举成员变量时 typescript 编译器错误

casting - 将 int 转换为枚举

c++ - C++ 中的位标志枚举

c# - 使用 fileupload 控件获取文件的路径

c# - 如何在 ASP .NET Core 中生成和管理 API key

c# - 使用 EF Code First 方法在域模型中使用枚举值

c# - 用标志方法扩展枚举?

c - 如何在c中格式化标志?