我已经使用了很长时间了。现在我想知道它是如何工作的。我有一个例子:
If e.State And DrawItemState.Selected Then
'if e.state includes DrawItemState.Selected do something
End If
E.state有像1 2 4 8 16 32 64 128之类的选项等等...... e.State也可以包含多个选项。例如,4 + 32,其中36包括两个状态。我可以用“和”运算符检查它们。我完全了解使用情况,但我不知道它是如何工作的。另外我想知道用“选择案例”块检查每个条件会更有效率。
编辑:我现在明白了逻辑。效率怎么样?答案 0 :(得分:4)
这是一个bitwise operation。查看二进制数字(1,2,4,8 ...):1
,10
,100
,1000
等。如果添加它们,则会得到它们例如1010
和“anding”他们带来了例如。
1010
& 1000
====
1000
由于False = 0且True =所有内容都不是0,因此if语句有效。
答案 1 :(得分:2)
您的代码实际上会混淆逻辑和按位AND运算符:存在隐式转换,如果您打开Option Strict On,则会抛出编译器错误。仅使用按位运算符更为“正确”,如下所示:
If (e.State And DrawItemState.Selected) = DrawItemState.Selected Then
你的问题非常好。 Visual Basic的AND运算符在这方面有点令人困惑,我相信很多程序员会有同样的困惑。当然,我当天做了: - )
至于效率与SELECT CASE相比,它取决于你是想要自己处理每个标志,还是处理标志模式。
如果您将e.State视为一组灯开关,无论是开启还是关闭,都会有所帮助。 SELECT CASE可用于处理交换机的模式,但不能用于处理各个交换机。
例如
CASE DrawItemState.Selected
仅在e.State为ON时才会触发。选中。如果e.State是.Selected加上.Focus,就像这样:
e.State = DrawItemState.Selected Or DrawItemState.Focus
然后CASE语句不会触发。