使用“Is”运算符选择Case

时间:2012-07-03 10:17:27

标签: vb.net select case

在VB.NET中,我必须比较select case语句中的一些对象。

由于select case默认使用=运算符,而且没有为对象定义,因此会抛出编译错误。

我目前使用此解决方法:

Select Case True
    Case sender Is StyleBoldButton

    Case sender Is StyleUnderButton

    Case sender Is StyleItalicButton

End Select

实际上有效。

有什么比较漂亮的东西更容易理解吗?

4 个答案:

答案 0 :(得分:11)

任何具有必需的比较运算符(=,> =,< =等)的东西都是Select Case的公平游戏。正确(或错误地)引用只是不与VB中的=进行比较;必须使用Is。 (或Object.Equals(objA As Object, objB As Object) - 但是,真的,为什么?当你有Is时?)

但是看看Object equality behaves different in .NET - 也许VB方式不那么令人困惑?无论如何,我认为你已经坚持使用If-ElseIf阶梯,因为Select Case没有Is。 (嗯,确实如此,但这是一个不同的Is,更像是Hypercard的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

在面对要比较的两种.Equals类型时,我指望==像C#object一样工作(请参阅http://visualstudiomagazine.com/articles/2011/02/01/equality-in-net.aspx)。这样做的好处是sender只提到一次;但是,您需要为每个“案例”键入所有这些ElseIf .Equals( ... ) Then

我不会自己使用的另一种方法是使用GetHashCode()

Select Case sender.GetHashCode()

    Case StyleBoldButton.GetHashCode()

    Case StyleUnderButton.GetHashCode()

    Case StyleItalicButton.GetHashCode()

    Case Else

End Select

在这里,我指望我({非常)知道GetHashCode()对于唯一(足够)识别这些控件的信息。 (见Default implementation for Object.GetHashCode())。

答案 1 :(得分:5)

我刚遇到同样的问题。在看到另一篇文章和这篇文章之后,我为自己找到了这个解决方案,我想分享以防有人在那里真的想像我一样使用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以便更好地跟踪错误。

答案 2 :(得分:-1)

简洁,但更具可读性:

if typeof(sender) is StyleBoldButton then

elseif typeof(sender) is StyleUnderButton then

elseif typeof(sender) is StyleItalicButton then

else

end if

答案 3 :(得分:-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