14

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

由于默认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是 Hypercard。)我认为梯子看起来很聪明,很容易理解:

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# 一样工作(请参阅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

16 年 6 月 16 日更新:删除了“Is =”,因为它是不必要的。

16 年 8 月 27 日更新:将字符串的使用更改为使用 .Name 以更好地跟踪错误。

于 2014-10-23T23:24:58.407 回答
-1

Less concise, but much more readable:

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 回答