使用"Is"运算符选择Case

Tee*_*jay 13 vb.net select case

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

由于默认情况下select case使用=operator而没有为对象定义,因此抛出了编译错误.

我目前使用此解决方法:

Select Case True
    Case sender Is StyleBoldButton

    Case sender Is StyleUnderButton

    Case sender Is StyleItalicButton

End Select
Run Code Online (Sandbox Code Playgroud)

这实际上有效.

是否有更漂亮的东西可以看到,更容易理解?

rsk*_*kar 11

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

但是看一下.NET中的Object等同行为 - 也许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 
Run Code Online (Sandbox Code Playgroud)

正如您所指出的,该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
Run Code Online (Sandbox Code Playgroud)

在面对两种类型进行比较时,我指望.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
Run Code Online (Sandbox Code Playgroud)

在这里,我指望我所知道的(非常)很少GetHashCode(),唯一(足够)识别这些控件.(请参阅Object.GetHashCode()的默认实现).


Jef*_*rey 6

我只是遇到了同样的问题。看完另一篇文章和这篇文章后,我为自己准备了这个解决方案,我想分享一下,以防有人真的想像我一样使用Select Case :)

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

        Case StyleUnderButton.Name

        Case StyleItalicButton.Name

    End Select
Run Code Online (Sandbox Code Playgroud)

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

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