实现|比较中的运算符

时间:2015-11-28 12:54:05

标签: c#

我正在处理一些输入处理,我想实现这个

的简写
if (KeyboardEvents.Down.Contains(Keys.LeftShift) || KeyboardEvents.Down.Contains(Keys.RightShift))

进入这个

if (KeyboardEvents.Down.Contains(Keys.LeftShift | Keys.RightShift))

我已经在这样的属性中使用了几次这种语法。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]

我不确定它是否可以按照我想要的方式行事,但这将是一个简洁的速记,简化了几个if。

是的简写编译,显然它做了一些事情,但不是我想的那样(问题的另一个问题是,它实际上做了什么?)。

这是键盘输入处理背后的结构。

public static class KeyboardEvents
{
    public static KeyboardState State { get { return Keyboard.GetState(); } }
    public static Keys[] Down = new Keys[0];
    public static IEnumerable<Keys> WasDown = new Keys[0];
    public static void Update(GameTime gameTime)
    {
        Keys[] NewDown = State.GetPressedKeys();
        WasDown = Down.Except(NewDown);
        Down = NewDown;
    }
}

2 个答案:

答案 0 :(得分:4)

按位OR和逻辑OR具有不同的含义。前者将按位或在两个标志之间执行,这意味着:

Class = 0x0004,
Struct = 0x0008,

将使AttributeTarget的枚举值等于0x0012,这两个值之间是按位OR。

您可以通过一个简单的示例自己看到:

var targetAttributes = AttributeTargets.Class | AttributeTargets.Struct;
Console.WriteLine((int)targetAttributes);

逻辑OR表示&#34;评估左手表达式,如果计算结果为true,则按照分支进行操作。否则,评估右手表达式,如果计算结果为真,则按照分支&#34;。

如果KeyboardEventsenum,您可以使用Enum.HasFlag查看是否设置了任何标记:

if (KeyboardEvents.HasFlag(Keys.LeftShift | Keys.RightShift))
{
    // Do stuff.
}

答案 1 :(得分:2)

你可以转过身来说

if({Keys.LeftShift, Keys.RightShift}.contains(KeyboardEvents.Down)).