3

我已经用了很长时间了。现在我想知道它是如何工作的。我有一个例子:

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 包括两个状态。我可以用“and”运算符检查它们。我完全了解用法,但我不知道它是如何工作的。另外我想知道用“Select Case”块检查每个条件是否更有效。

编辑:我现在明白了逻辑。效率怎么样?

4

2 回答 2

4

这是一个按位运算。查看二进制中的数字(1、2、4、8...):1101001000。如果将它们相加,则会得到例如1010,并且“与”它们会带来例如

  1010
& 1000
  ====
  1000

由于 False = 0 和 True = 所有不为 0 的 if 语句有效。

于 2012-08-26T12:29:28.000 回答
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 为 ONLY .Selected 时才会触发。如果 e.State 是 .Selected 加上 .Focus,像这样:

e.State = DrawItemState.Selected Or DrawItemState.Focus

那么该 CASE 语句将不会触发。

于 2012-08-27T00:59:54.257 回答