定义枚举标志值的惯例是什么?

Nol*_*nar 0 c# enum-flags

假设我有以下代码:

[Flags]
enum MyFlags
{
    None = 0,
    A = 1,
    B = 2,
    C = 4,
    D = 8,
    E = 16,
    // ...
}
Run Code Online (Sandbox Code Playgroud)

当标志量变得非常大时,这显然不是最佳的.并通过最佳,平均可读,不快速或节省内存.

对于组合标志,例如

AB = 3
Run Code Online (Sandbox Code Playgroud)

我们可以轻松使用

AB = A | B
Run Code Online (Sandbox Code Playgroud)

相反,它更具可读性.
并用于组合所有标志

All = A | B | C | ...
Run Code Online (Sandbox Code Playgroud)

它会更有利于使用

All = ~None
Run Code Online (Sandbox Code Playgroud)

相反,即使我们没有充分利用所有可用的32/64位.

但是常规价值呢?

之间

E = 16
E = 0b10000
E = 0x10
E = 1 << 4
Run Code Online (Sandbox Code Playgroud)

或其他我没有想到的方法,哪种方式最适合大量的旗帜?

或者换句话说,在C#中为标志设置值的(商定的)约定是什么?

让我们假设为了论证,值不会对齐,所以代码可能看起来像这样

None = 0,
Apple = 1,
Banana = 2,
StrangeFruit = Apple | Banana,
Cherry = 4,
Date = 8,
Elderberry = 16,
// ...
Run Code Online (Sandbox Code Playgroud)

Tim*_* S. 7

对于常规值,我喜欢1 << n:在你花了很短的时间来理解它之后,很容易看出发生了什么,很难搞乱,并且不需要十六进制/二进制转换/思考.

[Flags]
enum MyFlags
{
    None = 0,
    A = 1 << 0,
    B = 1 << 1,
    C = 1 << 2,
    D = 1 << 3,
    E = 1 << 4,
    // ...
    Lastly = 1 << 31,
}
Run Code Online (Sandbox Code Playgroud)

就实际定义的惯例而言,我认为不存在.MS的Enum设计指南说

对标志枚举值使用2的幂,以便可以使用按位OR运算自由组合.

但是没有指定如何在源代码中编写它(这些是与语言无关的指导原则;在C#中可能有用的东西甚至可能不适用于另一种.Net语言).