假设我有以下代码:
[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)
对于常规值,我喜欢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语言).
| 归档时间: |
|
| 查看次数: |
249 次 |
| 最近记录: |