可以将 2 的非幂值添加到带有标志的枚举中吗?
Okay to add non-power of 2 values to enum with flags?
在我下面的枚举中,我的意图是能够使用 Scheduled
来表示 'ILT | VILT | HVILT'。显然,在制作这种枚举的指南中,每个人都建议使用 2 的幂,但如果我的意思是 Scheduled
是其他值的组合,那么这应该没问题,对吧?
或者在执行此操作时有什么需要注意的地方吗?
[Flags]
public enum Modalities
{
None = 0,
ILT = 1,
VILT = 2,
HVILT = 4,
Scheduled = 7,
Online = 8,
Package = 16,
All = ~None
}
就功能而言,没有什么可担心的。
在可读性方面,您可能会考虑两个更改。
首先,我觉得 Scheduled = 7
不可读。在这种情况下,很简单,它包括 ILT
、VILT
和 HVILT
标志。但有一天你可能会遇到需要使用更复杂的标志和数字,例如 173
并不那么容易立即分解。正确的方法是使用 Scheduled = ILT | VILT | HVILT
其次,我不喜欢双显式的打字能力。 Bitshift 运算符让您有机会对所有枚举值使用统一的表示法。
这里用一个例子来表达我自己的想法。
[Flags]
public enum Modalities
{
None = 0,
ILT = 1 << 0,
VILT = 1 << 1,
HVILT = 1 << 2,
Online = 1 << 3,
Package = 1 << 4,
Scheduled = ILT | VILT | HVILT,
All = ~None
}
在我下面的枚举中,我的意图是能够使用 Scheduled
来表示 'ILT | VILT | HVILT'。显然,在制作这种枚举的指南中,每个人都建议使用 2 的幂,但如果我的意思是 Scheduled
是其他值的组合,那么这应该没问题,对吧?
或者在执行此操作时有什么需要注意的地方吗?
[Flags]
public enum Modalities
{
None = 0,
ILT = 1,
VILT = 2,
HVILT = 4,
Scheduled = 7,
Online = 8,
Package = 16,
All = ~None
}
就功能而言,没有什么可担心的。
在可读性方面,您可能会考虑两个更改。
首先,我觉得 Scheduled = 7
不可读。在这种情况下,很简单,它包括 ILT
、VILT
和 HVILT
标志。但有一天你可能会遇到需要使用更复杂的标志和数字,例如 173
并不那么容易立即分解。正确的方法是使用 Scheduled = ILT | VILT | HVILT
其次,我不喜欢双显式的打字能力。 Bitshift 运算符让您有机会对所有枚举值使用统一的表示法。
这里用一个例子来表达我自己的想法。
[Flags]
public enum Modalities
{
None = 0,
ILT = 1 << 0,
VILT = 1 << 1,
HVILT = 1 << 2,
Online = 1 << 3,
Package = 1 << 4,
Scheduled = ILT | VILT | HVILT,
All = ~None
}