在比较中实现|运算符

本文关键字:运算符 实现 比较 | 更新日期: 2023-09-27 18:24:55

我正在进行一些输入处理,我想实现这个的简写

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;
    }
}

在比较中实现|运算符

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

Class = 0x0004,
Struct = 0x0008,

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

你可以通过一个简单的例子看到这一点:

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

逻辑OR的意思是"对左手表达式求值,如果求值结果为true,则跟随该分支。否则,对右手表达式求值,若求值结果为true,则跟随分支"。

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

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

你可以把它转过来说

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