c# - 实现 |比较中的运算符

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

最佳答案

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

Class = 0x0004,
Struct = 0x0008,

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

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

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

逻辑 OR 的意思是“计算左边的表达式,如果它的计算结果为真,则跟随分支。否则,计算右边的表达式,如果它的计算结果为真,则跟随分支”。

如果 KeyboardEvents 是一个 enum,您可以使用 Enum.HasFlag查看是否设置了任何标志:

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

关于c# - 实现 |比较中的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33971534/

相关文章:

C# 即使使用 "using System.Data.SqlClient;"也无法识别 SQLConnection

c# - RestSharp序列化JSON数组请求参数

c# - 如何使用 Xamarin Android LocalBroadcastManager

c# - 在 Windows、MonoForAndroid 和 MonoTouch 上实现接口(interface)的差异

c# - 使用 Expression 类构造 LINQ 表达式时按正则表达式搜索

c# - C#查看任务状态的方法

c# - 使用现有对象而不是创建特定的锁定对象安全吗?

c# - .Net中的Dictionary在并行读写时是否有可能导致死锁?

c# - 获取具有特定属性值的 linq to xml 后代元素

c# - 长期静态页面缓存