这句话在c#中是什么意思?

本文关键字:意思 是什么 这句话 | 更新日期: 2023-09-27 18:09:45

if ((a & b) == b)在下面的代码块中是什么意思?

if ((e.Modifiers & Keys.Shift) == Keys.Shift)
{
    lbl.Text += "'n" + "Shift was held down.";
}

为什么不是这样?

if (e.Modifiers == Keys.Shift)
{
    lbl.Text += "'n" + "Shift was held down.";
}

这句话在c#中是什么意思?

如果你看一下Keys enum,这是带有[FlagsAttribute]属性的标志enum。

仅当要对数字值执行位操作(AND, OR, EXCLUSIVE OR)时,才对枚举使用FlagsAttribute自定义属性。

定义以2为幂的枚举常量,即1、2、4、8等。这意味着组合枚举常量中的单个标志不重叠。

所以e.Modifiers可能是一个以上枚举的组合:

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter

只是一个很简单的假设来解释这个概念:

Keys.Shift  : 001 (1)
Keys.Cancel : 010 (2)
Keys.Enter  : 100 (4)

:

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter equal 001 | 010 | 100 = 111

条件:

    e.Modifiers & Keys.Shift equal 111 & 001 = 001

意思是:

 e.Modifiers & Keys.Shift == Keys.Shift

如果e.Modifiers不包含Keys.Shift:

e.Modifiers = Keys.Cancel | Keys.Enter (110)

所以结果将是:

e.Modifiers & Keys.Shift equals 110 & 001 = 000 (is not Keys.Shift)

总结一下,这个条件检查e.Modifiers是否包含Keys.Shift

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

示例:

a   -> 00110011
b   -> 00000011
a&b -> 00000011

在你的代码

if ((e.Modifiers & Keys.Shift) == Keys.Shift)

检查键。Shift包含在e.Modifiers中。

单个&符号表示位与操作符。当与带有[Flags]属性的枚举(Keys枚举具有此属性)结合使用时,如您所示,它用于确定该枚举的某个位是否已设置。

可以同时按下多个修饰符键,这就是为什么使用它而不是直接比较的原因。

你可以在这里阅读更多关于枚举标志的信息。向下滚动到标题为"作为位标志的枚举类型"的小节。您将看到一个与此非常相似的示例。

单个&符号(&)是位与,所以它基本上是将(A &B),然后检验(a &B) == B

所以在你的例子中,它基本上是说如果shift键被按下(任何键+ shift) == shift。

它使用按位操作来查询是否设置了"标志"(位)(等于1)。

最好在http://msdn.microsoft.com/en-us/library/vstudio/cc138362.aspx上阅读枚举和位运算

&是位与运算符。它所做的是Keys是一个标志枚举,Keys中的值可以是几个值的按位组合。因此,要测试任何特定的值,您首先将您的值与您想要测试的值进行和,然后将其与您想要测试的值进行比较。

例如,您可能同时按住shift和ctrl键,因此e.Modifier中的值将是Keys.ShiftKeys.Ctrl的按位组合。所以这:
e.Modifier == Keys.Shift

是错误的。按住Shift键,同时按住Ctrl键。如果您想知道Shift键是否被按下而不管其他键是否被按下,您需要首先过滤掉所有其他键。这很容易通过使用Keys.Shift作为过滤器来完成:

(e.Modifier & Keys.Shift) == Keys.Shift

如果shift键被按下而不管其他键被按下,该值为真,否则为假。

第1部分

是逻辑与运算符

当需要在一个标志中设置多个标志时使用,例如Integer:

例如,

a是3,表示二进制记数法中的00000011。例如,B是2,在二进制表示法中表示00000010。

当你想检查a是否有b表示集合的标志(从右数第二个位)时,你可以使用AND操作符:

,B = 00000010

当这个等于b(或者是> 0),你就知道这个标志被设置了。

第2部分

相等操作符也可以用于您想要检查是否"键。"Shift"是唯一的"修饰符"键,其他键都不按。当您使用第一个代码时,也可以按下其他"修饰符"键,并且if条件仍然为真。

单个&符号(&)执行逐位与操作;双&符号(&&)执行布尔与操作。

按位操作,并对两个参数的每个位执行与操作(因此称为"按位")。因此,按位与运算(或任何按位运算)的输出将不会是布尔值。以下是一些逐位与操作的示例:

1001 & 0001 = 0001
1101 & 1111 = 1101

布尔与运算对两个布尔值进行操作并返回一个布尔值:

true && true = true
false && true = false

短路
布尔与运算(&&)也可以在两个返回布尔值的表达式上执行:

int a = 5;
int b = 10;
bool result = (a < 3) && (b > 3);
// result will be false;

因为第一个表达式(a < 3)求值为false,所以结果不可能是true,因为两个表达式都必须求值为true才能得到true。因此,第二个表达式甚至不会被求值。这被称为"短路"。但是,对于逐位与操作,两个表达式都需要在执行操作之前求值。因此,在大多数情况下,当您只想确定两件事是否为真(布尔)时,布尔AND (&&)将是最佳选择。

在您的示例中,代码将e.Modifiers中的单个位与Keys.Shift中的单个位进行比较。两个参数都不表示布尔值,因此操作是按位(&)而不是布尔(&&)。