必要な比較演算子(=、> =、<=など)が定義されているものはすべて、の公正なゲームですSelect Case
。正しく(または間違って)、参照=
はVBと比較されません。を使用する必要がありますIs
。(またはObject.Equals(objA As Object, objB As Object)
-しかし、実際には、なぜですか?あなたが持っているときIs
?)
しかし、オブジェクトの同等性は.NETでは異なる動作をすることを確認してください-おそらくVBの方法はそれほど混乱していませんか?いずれにせよ、あなたはIf-ElseIfラダーで立ち往生していると思いSelect Case
ますIs
。(まあ、そうですが、それはハイパーカードIs
のようit
に異なります。)はしごはスマートでわかりやすいように見えると思います。
If sender Is StyleBoldButton Then
ElseIf sender Is StyleUnderButton Then
ElseIf sender Is StyleItalicButton Then
Else
End If
ご指摘のとおり、このSelect Case True
パターンはVB6での「OrElse」短絡回避策です。これは、実際のニーズを満たすための奇抜な方法です。しかし、それはVB.NETでは必要ありません。その精神では、オブジェクト指向言語に期待されるベストプラクティスに沿ったデザインパターンを使用する方がよいかもしれません。たとえば、Denis Trollerが提案したように、各ボタンに独自のイベントハンドラーを与えてみませんか?
しかし、Is-able Selectのようなものを主張する場合、私がおそらく自分で使用しないものがあります。
With sender
If .Equals(StyleBoldButton) Then
ElseIf .Equals(StyleUnderButton) Then
ElseIf .Equals(StyleItalicButton) Then
Else
End If
End With
ここでは、比較する2つのタイプに直面したときに.Equals
C#のように機能することを期待しています( http://visualstudiomagazine.com/articles/2011/02/01/equality-in-net.aspxを参照)。これの美しさは、一度だけ言及されることです。ただし、「ケース」ごとに入力する必要があるのはこれだけです。==
object
sender
ElseIf .Equals( ... ) Then
私が自分自身を使用しない別の方法は、使用することですGetHashCode()
:
Select Case sender.GetHashCode()
Case StyleBoldButton.GetHashCode()
Case StyleUnderButton.GetHashCode()
Case StyleItalicButton.GetHashCode()
Case Else
End Select
GetHashCode()
ここでは、これらのコントロールを一意に(十分に)識別するために、私が知っている(非常に)ほとんど何を期待しています。(Object.GetHashCode()のデフォルトの実装を参照してください)。