if ((a & b) == b)以下代码块中的含义是什么?
if ((e.Modifiers & Keys.Shift) == Keys.Shift)
{
lbl.Text += "\n" + "Shift was held down.";
}
Run Code Online (Sandbox Code Playgroud)
为什么不是这样的?
if (e.Modifiers == Keys.Shift)
{
lbl.Text += "\n" + "Shift was held down.";
}
Run Code Online (Sandbox Code Playgroud)
cuo*_*gle 17
如果你看一下Keysenum,这是带有属性的标志枚举[FlagsAttribute].
仅当要对数值执行按位运算(AND,OR,EXCLUSIVE OR)时,才使用FlagsAttribute自定义属性进行枚举.
定义2的幂的枚举常量,即1,2,4,8等.这意味着组合枚举常量中的各个标志不重叠.
所以e.Modifiers可能是多个枚举的组合:
e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter
Run Code Online (Sandbox Code Playgroud)
只是非常简单的假设来解释这个概念:
Keys.Shift : 001 (1)
Keys.Cancel : 010 (2)
Keys.Enter : 100 (4)
Run Code Online (Sandbox Code Playgroud)
所以:
e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter equal 001 | 010 | 100 = 111
Run Code Online (Sandbox Code Playgroud)
条件:
e.Modifiers & Keys.Shift equal 111 & 001 = 001
Run Code Online (Sandbox Code Playgroud)
它的意思是:
e.Modifiers & Keys.Shift == Keys.Shift
Run Code Online (Sandbox Code Playgroud)
如果e.Modifiers不包含Keys.Shift:
e.Modifiers = Keys.Cancel | Keys.Enter (110)
Run Code Online (Sandbox Code Playgroud)
结果将是:
e.Modifiers & Keys.Shift equals 110 & 001 = 000 (is not Keys.Shift)
Run Code Online (Sandbox Code Playgroud)
油底壳了,这种情况下检查是否e.Modifiers含有Keys.Shift或不
它是布尔逻辑(&="按位和").检查变量是否包含值.它就像一个过滤器.
例如:
a -> 00110011
b -> 00000011
a&b -> 00000011
Run Code Online (Sandbox Code Playgroud)
在你的代码中
if ((e.Modifiers & Keys.Shift) == Keys.Shift)
Run Code Online (Sandbox Code Playgroud)
检查Keys.Shift包含在e.Modifiers中.