14

select caseVB.NETでは、ステートメント内のいくつかのオブジェクトを比較する必要があります。

デフォルトでselect caseは演算子を使用し、これはオブジェクトに対して定義されていないため、コンパイルエラーがスローされます。=

私は現在、この回避策を使用しています。

Select Case True
    Case sender Is StyleBoldButton

    Case sender Is StyleUnderButton

    Case sender Is StyleItalicButton

End Select

これは実際に機能します。

見やすく、理解しやすいものはありますか?

4

4 に答える 4

11

必要な比較演算子(=、> =、<=など)が定義されているものはすべて、の公正なゲームです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つのタイプに直面したときに.EqualsC#のように機能することを期待しています( http://visualstudiomagazine.com/articles/2011/02/01/equality-in-net.aspxを参照)。これの美しさは、一度だけ言及されることです。ただし、「ケース」ごとに入力する必要があるのはこれだけです。==objectsenderElseIf .Equals( ... ) Then

私が自分自身を使用しない別の方法は、使用することですGetHashCode()

Select Case sender.GetHashCode()

    Case StyleBoldButton.GetHashCode()

    Case StyleUnderButton.GetHashCode()

    Case StyleItalicButton.GetHashCode()

    Case Else

End Select

GetHashCode()ここでは、これらのコントロールを一意に(十分に)識別するために、私が知っている(非常に)ほとんど何を期待しています。(Object.GetHashCode()のデフォルトの実装を参照してください)。

于 2012-07-06T17:08:33.847 に答える
7

私はちょうどこれと同じ問題に遭遇しました。別の投稿とこの投稿を見た後、私は自分でこの解決策にたどり着きました。誰かが本当に私と同じようにSelect Caseを使用したい場合に備えて、共有したいと思いました:)

    Select Case DirectCast(sender, Button).Name
        Case StyleBoldButton.Name

        Case StyleUnderButton.Name

        Case StyleItalicButton.Name

    End Select

アップデート6-16-16:不要だったため、「Is="」を削除しました。

更新8-27-16:エラー追跡を改善するために、文字列の使用を.Nameを使用するように変更しました。

于 2014-10-23T23:24:58.407 に答える
-1

簡潔ではありませんが、はるかに読みやすくなっています。

if typeof(sender) is StyleBoldButton then

elseif typeof(sender) is StyleUnderButton then

elseif typeof(sender) is StyleItalicButton then

else

end if
于 2012-07-03T16:55:07.463 に答える
-2
 Private Sub btnNum_Click(sender As Object, e As EventArgs) Handles btnNum0.Click, btnNum1.Click, btnNum2.Click, btnNum3.Click, btnNum4.Click, btnNum5.Click, btnNum6.Click, btnNum7.Click, btnNum8.Click, btnNum9.Click, btnDicemalPoint.Click, btnNumClear.Click, btnExit.Click
        If result = "0" Then
            result = ""
        End If
        Select Case True
            Case sender Is btnNum0
                If result <> "0" Then
                    result = result & "0"
                End If
            Case sender Is btnNum1
                result = result & "1"
            Case sender Is btnNum2
                result = result & "2"
            Case sender Is btnNum3
                result = result & "3"
            Case sender Is btnNum4
                result = result & "4"
            Case sender Is btnNum5
                result = result & "5"
            Case sender Is btnNum6
                result = result & "6"
            Case sender Is btnNum7
                result = result & "7"
            Case sender Is btnNum8
                result = result & "8"
            Case sender Is btnNum9
                result = result & "9"
            Case sender Is btnDicemalPoint
                If String.IsNullOrEmpty(result.ToString) Then
                    result = result & "0."
                ElseIf Not result.ToString.Contains(".") Then
                    result = result & "."
                End If
            Case sender Is btnNumClear
                result = 0
            Case sender Is btnExit
                Me.Close()
        End Select
End Sub
于 2014-09-02T10:40:02.263 に答える