这句话在C#中意味着什么?

Moh*_*mad 11 c# if-statement

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或不


Xar*_*uth 5

它是布尔逻辑(&="按位和").检查变量是否包含值.它就像一个过滤器.

例如:

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中.