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 には複数のオプションを含めることができます。たとえば、36 である 4 + 32 には 2 つの状態が含まれます。「and」演算子で確認できます。使い方はよくわかりますが、どのように機能するのかわかりません。また、「Select Case」ブロックで各条件をチェックするよりも効率的かどうか疑問に思っています。

編集:ロジックを理解しました。効率性はどうですか?

4

2 に答える 2

4

これはビット演算です。2進数の数字(1、2、4、8 ...)を見てください:1、、、10など。それらを追加すると、egが得られ100、「anding」するとegが得られます。10001010

  1010
& 1000
  ====
  1000

False=0およびTrue=0以外のすべてであるため、ifステートメントは機能します。

于 2012-08-26T12:29:28.000 に答える
2

あなたのコードは、実際には論理演算子とビットごとの AND 演算子を混同しています。Option Strict をオンにすると、コンパイラ エラーをスローする暗黙のキャストがあります。次のように、ビットごとの演算子のみを使用する方が「正しい」です。

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 に答える