当[Flags]枚举类型没有定义它时,我应该如何表示None的值?

时间:2015-05-18 09:03:45

标签: c# enum-flags

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

2 个答案:

答案 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 可能被添加为“无”以外的其他内容。是的,不太可能,但并非完全不可能。