.net 带1 2 4 8 16类枚举的And运算符

.net 带1 2 4 8 16类枚举的And运算符,.net,vb.net,comparison,enumeration,.net,Vb.net,Comparison,Enumeration,我已经用这个很久了。现在我想知道它是如何工作的。我举一个例子: If e.State And DrawItemState.Selected Then 'if e.state includes DrawItemState.Selected do something End If E.state有12 4 8 16 32 64 128等选项。。。也就是说,州政府可以包括其中一个以上。例如,4+32即36包括两种状态。我可以和“和”接线员核对一下。我完全了解它的用法,但我不知道它是如何工作的

我已经用这个很久了。现在我想知道它是如何工作的。我举一个例子:

If e.State And DrawItemState.Selected Then
    'if e.state includes DrawItemState.Selected do something
End If
E.state有12 4 8 16 32 64 128等选项。。。也就是说,州政府可以包括其中一个以上。例如,4+32即36包括两种状态。我可以和“和”接线员核对一下。我完全了解它的用法,但我不知道它是如何工作的。此外,我想知道它是否比使用“Select Case”块检查每个条件更有效

编辑:我现在明白了逻辑。效率如何?

这是一个问题。查看二进制数字(1,2,4,8…):
1
10
100
1000
等。如果您添加它们,您将得到例如
1010
和“anding”它们,例如

  1010
& 1000
  ====
  1000

由于False=0和True=everything not 0,if语句可以工作。

您的代码实际上将逻辑运算符和按位and运算符合并在一起:存在一个隐式强制转换,如果启用Option Strict,则会引发编译器错误。只使用按位运算符更“正确”,如下所示:

If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
你的问题很好。VisualBasic的和运算符在这方面有点混乱,我相信许多程序员也会有同样的混乱。我当时确实是这样做的:-)

至于与SELECT CASE相比的效率,这取决于您是希望单独处理每个标志,还是处理标志的模式

如果你把e.State想象成一个开关面板,每个开关都是开着或关着的,这会很有帮助。SELECT CASE可用于处理开关的模式,但不能用于处理单个开关

比如说

CASE DrawItemState.Selected
仅当e.State为only.Selected时才会触发。如果选择了e.State加上.Focus,如下所示:

e.State = DrawItemState.Selected Or DrawItemState.Focus

那么这个CASE语句将不会触发。

请查看。这就是您在那里使用的
操作符。我想知道您是否能帮上忙。你要问的是一个“标志”枚举。我在问这里之前已经检查过了。它没有给我asnwer:(如果提供的两个链接没有给你想要的,也许你可以澄清或扩展你的问题,以帮助我们了解你需要什么?我的答案是O.R.Mapper。我刚刚检查了你的链接。它告诉你如何使用,但不是如何工作。如果我错了,请纠正我。“e.State和DrawItemState.Selected”返回DrawItemState。如果e.State包含DrwItemState,则选择此选项。选择?我越来越困惑:(好的。我手动完成了操作(笔和纸:)。现在一切都清楚了。效率如何?删除注释-我将其添加到我的回答中。我想我被误解了。我有两个选项。一个是使用标志,另一个是“和”运算符.Other是例如,为每个选项保留一个布尔值,并通过if语句检查每个选项。那么在这种情况下哪一个更有效?这取决于属性是否相互交互。如果您可以在不知道其他属性的状态的情况下处理.Selected属性,那么我将使用单独的布尔值va变量。但是,如果在处理之前必须考虑所有属性,那么我会使用标志。因此,它会比较整数和“and”运算符的每一位都倾向于0到1。对于一种最高级别的语言来说,这真的很有趣。它有效吗?它不“favor”它。它逐位比较两个值,如果两个值在同一位置都有一个1,则ouptut值在该位置将有一个1(即1010&1000=1000和1010&0101=0000和1010&0010=0010;查找按位操作:OR和XOR)。由于它是单处理器操作,因此通常非常有效。