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

本文关键字:None 何表示 表示 值时 枚举 Flags 类型 定义 | 更新日期: 2023-09-27 17:49:41

今天使用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]枚举类型没有定义None值时,我该如何表示None值?

是。因为它是一个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"之外的其他内容。是的,不太可能,但也不是完全不可能。