4

今天在使用 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?根据设计指南,它应该有这个值,但它没有。

4

2 回答 2

3

是的。由于它是一个Flags枚举,因此没有设置任何可能值的状态将是(Buttons)0(或者default(Buttons)如果您希望以某种方式直接在代码中反映类型),无论是分配类型的设计器一个名字给它与否。

考虑一下,如果我们可以表达“没有按下不是 A 按钮的按钮,也没有按下 A 按钮” Buttons.A & ~Buttons.A,结果将是(Buttons)0。“没有按下按钮”状态已经是0

(我能想到的省略的一个理由None是,您打算在按下值的情况下从不使用类型None。例如,您仅将其用于对按下按钮作出反应的代码,因此None永远不会出现。即使这样,人们也可以发现在代码中使用None/0值很有用,但这可能意味着不命名它更合理)。

于 2015-05-18T09:24:07.010 回答
1

没有上下文很难说。如果您想代表一种状态,即按下或不按下某物,我会Nullable<Buttons>在这种情况下选择:

class Input
{
    ...
    private Buttons? _buttons;
    ...
}

它还可以保护您免受未来版本可能Buttons添加的“无”以外的含义。是的,不太可能,但并非完全不可能。0

于 2015-05-18T10:25:49.947 回答