今天在使用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关于proper use of the [Flags]
attribute:
命名flags枚举
None
的零值。对于标志枚举,该值必须始终表示所有标志都已清除。
如果我想指出一个没有按下按钮的值,是否会违反枚举类型的意图使用值0并将其强制转换为Buttons
?根据设计指南,它应具有此值,但它没有。
答案 0 :(得分:3)
是。由于它是Flags
枚举,因此如果您希望以某种方式指示它,那么所设置的任何可能值的状态都不会是(Buttons)0
(或default(Buttons)
直接在你的代码中的类型),是否为该类型的设计者指定了名称。
考虑一下,如果我们可以通过Buttons.A & ~Buttons.A
表达“没有按下A按钮的按钮而且没有按下A按钮”,结果将是(Buttons)0
。 “没有按下按钮”状态已经是0
。
(我可以想到的遗漏None
的一个理由是你打算在None
是按下的值的情况下从不使用类型。例如,你只是在使用这对于对按下的按钮作出反应的代码,因此None
永远不会出现。即使这样,也可以使用代码中有用的None
/ 0
值找到它,但它可能意味着保留未命名更合理。)
答案 1 :(得分:1)
没有上下文就很难说。如果你想代表一个某个地方被压迫的状态,我会在这种情况下选择Nullable<Buttons>
:
class Input
{
...
private Buttons? _buttons;
...
}
它还可以保护您免于Buttons
的未来版本,其中0
可能被添加为“无”以外的其他内容。是的,不太可能,但并非完全不可能。