当 [Flags] 枚举类型未定义时,我应该如何表示 None 的值?
How should I represent a value of None when a [Flags] enum type doesn't define it?
今天在使用 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:
Do name the zero value of flags enumerations None
. For a flags enumeration, the value must always mean all flags are cleared.
如果我想在没有按下任何按钮的情况下指示一个值,使用值 0 并将其转换为 Buttons
是否会违背枚举类型的意图?根据设计准则,它应该有这个值,但是没有。
是的。由于它是一个 Flags
枚举,所设置的可能值的 none 的状态将是 (Buttons)0
(或者 default(Buttons)
如果您希望在直接在您的代码中反映类型的某种方式),无论类型的设计者是否为其分配了名称。
考虑如果我们可以通过Buttons.A & ~Buttons.A
表达"no button that isn't the A button is pressed and also the A button isn't pressed",结果将是(Buttons)0
。 "no button pressed" 状态已经是 0
.
(我能想到的遗漏 None
的一个理由是你打算在 None
是按下的值的情况下永远不会使用类型。例如,你是仅将此用于对按下按钮做出反应的代码,因此 None
永远不会出现。即使这样,人们也可以发现使用 None
/0
值在代码中很有用,但它可以意味着不命名更合理)。
没有上下文就不好说了。如果你想表示一个状态,在这种情况下,我会选择 Nullable<Buttons>
:
class Input
{
...
private Buttons? _buttons;
...
}
它还使您免受 Buttons
的未来版本的影响,其中 0
可能 被添加以表示 "None" 以外的含义。是的,不太可能,但并非完全不可能。
今天在使用 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:
Do name the zero value of flags enumerations
None
. For a flags enumeration, the value must always mean all flags are cleared.
如果我想在没有按下任何按钮的情况下指示一个值,使用值 0 并将其转换为 Buttons
是否会违背枚举类型的意图?根据设计准则,它应该有这个值,但是没有。
是的。由于它是一个 Flags
枚举,所设置的可能值的 none 的状态将是 (Buttons)0
(或者 default(Buttons)
如果您希望在直接在您的代码中反映类型的某种方式),无论类型的设计者是否为其分配了名称。
考虑如果我们可以通过Buttons.A & ~Buttons.A
表达"no button that isn't the A button is pressed and also the A button isn't pressed",结果将是(Buttons)0
。 "no button pressed" 状态已经是 0
.
(我能想到的遗漏 None
的一个理由是你打算在 None
是按下的值的情况下永远不会使用类型。例如,你是仅将此用于对按下按钮做出反应的代码,因此 None
永远不会出现。即使这样,人们也可以发现使用 None
/0
值在代码中很有用,但它可以意味着不命名更合理)。
没有上下文就不好说了。如果你想表示一个状态,在这种情况下,我会选择 Nullable<Buttons>
:
class Input
{
...
private Buttons? _buttons;
...
}
它还使您免受 Buttons
的未来版本的影响,其中 0
可能 被添加以表示 "None" 以外的含义。是的,不太可能,但并非完全不可能。