4

今日 XNA を使用しているときに、使用する列挙型の 1 つに値[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,
}

属性の適切な使用[Flags]に関するMSDNによると:

flags enumerations のゼロ値に名前を付けてください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のあるwhereの将来のバージョンからも保護します。はい、可能性は低いですが、完全に不可能というわけではありません。0

于 2015-05-18T10:25:49.947 に答える