今天使用XNA时,我注意到使用[Flags]
的枚举类型之一没有None = 0
值:
[Flags]
public enum Buttons
{
DPadUp = 1,
DPadDown = 2,
DPadLeft = 4,
DPadRight = 8,
Start = 16,
Back = 32,
LeftStick = 64,
RightStick = 128,
LeftShoulder = 256,
RightShoulder = 512,
BigButton = 2048,
A = 4096,
B = 8192,
X = 16384,
Y = 32768,
LeftThumbstickLeft = 2097152,
RightTrigger = 4194304,
LeftTrigger = 8388608,
RightThumbstickUp = 16777216,
RightThumbstickDown = 33554432,
RightThumbstickRight = 67108864,
RightThumbstickLeft = 134217728,
LeftThumbstickUp = 268435456,
LeftThumbstickDown = 536870912,
LeftThumbstickRight = 1073741824,
}
根据MSDN关于[Flags]
属性的正确使用:
将标志枚举的零值命名为
None
。对于标志枚举,该值必须始终表示清除所有标志。
如果我想指示一个没有按下按钮的值,使用值0并将其强制转换为Buttons
是否违背enum类型的意图?根据设计指南,it 应该有这个值,但是它没有。
是。因为它是一个Flags
枚举,所以所设置的所有可能值的状态都不会是(Buttons)0
(或者default(Buttons)
,如果您更愿意以某种方式直接在代码中反映类型),无论类型的设计器是否为其分配了名称。
考虑如果我们可以通过Buttons.A & ~Buttons.A
表达"除了A按钮之外没有按钮被按下,而且A按钮也没有被按下",那么结果将是(Buttons)0
。未按下按钮状态已为0
。
(我能想到的省略None
的一个理由是,您打算在None
是按下的值的情况下永远不会使用类型。例如,你只使用这个代码对按钮被按下作出反应,因此None
永远不会出现。即使这样,我们也可以发现使用None
/0
值在代码中很有用,但这可能意味着不命名它更合理)。
没有上下文很难说。如果你想表示一种状态,在这种情况下,我将选择Nullable<Buttons>
:
class Input
{
...
private Buttons? _buttons;
...
}
它还可以保护您免受Buttons
的未来版本的影响,其中0
可能会添加以表示除"None"之外的其他内容。是的,不太可能,但也不是完全不可能。