在VB.NET中选择对象类型的Case

mcj*_*erz 40 vb.net switch-statement select-case

我不确定这个有效的C#,但希望你能得到这个想法.:)

switch (msg.GetType()) {
    case ClassA:
        // blah
    case ClassB:
        // blah 2
    case ClassC:
        // blah 3
}
Run Code Online (Sandbox Code Playgroud)

我如何使用VB.NET打开对象的类型Select Case

我知道有些人可能会建议使用多态,但我使用的是小型消息类的层次结构,所以在我的情况下真的不行.

Met*_*ght 72

使用VB 2010,对于面向.NET framework 4及更高版本的项目,您现在可以执行以下操作:

Select Case msg.GetType()
    Case GetType(ClassA)
End Select
Run Code Online (Sandbox Code Playgroud)

在早期的VB版本中,它不起作用,因为你无法比较两个类型是否相等.您必须使用Is关键字检查它们是否指向相同的引用.除非您使用像Name或FullName这样的类型的属性进行比较,否则不可能在Select Case中执行此操作,如Michael所建议的那样.您可以使用If和ElseIf的组合:

Dim type = msg.GetType()
If type Is GetType(ClassA)
    ...
ElseIf type Is GetType(ClassB)
    ...
...
End If
Run Code Online (Sandbox Code Playgroud)

  • 你可以用一粒盐来做你自己的性能测试:我自己的简单性能测试`If/ElseIf` vs`Select Case`证明了`If/ElseIf`选项每次都更快."选择案例"大约需要4倍的时间.我现在坚持使用`If/ElseIf`. (3认同)

Dan*_*Tao 20

好吧,如果你坚持使用Select Case,你可以随时使用:

Select Case True
    Case TypeOf msg Is ClassA
        ' do something '
    Case TypeOf msg Is ClassB
        ' do something else '
    Case Else
        ' and so on '
End Select
Run Code Online (Sandbox Code Playgroud)

但我想大多数人都喜欢避免这种事情.如果/ ElseIf可能会更清楚.

  • 请避免这种事情!:) (10认同)
  • 实际上这看起来并不坏,特别是当你可能有多个案例(跌倒)时 - 这看起来比MIL语句更好...... (6认同)
  • 我更喜欢CASE而不是嵌套的IF - 更易读,更不易出错的IMO.我使用SELECT CASE True ...经常,效果很好. (3认同)
  • 如果块很短,我对这个问题很矛盾.反对这部分代码的论据是什么? (2认同)

小智 7

这是一种在同一个子句中处理Button1和Button2单击事件的方法(我最初是作为VB6程序员开始的,因此这是VB6处理控件数组的一个很好的替代品)

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
                Select Case True
                    Case sender Is Me.Button1
                        ' Do Button1 stuff '
                    Case sender Is Me.Button2
                        ' Do Button2 stuff '
                End Select
            End Sub
Run Code Online (Sandbox Code Playgroud)


Mr *_*ubs 6

我永远不会select case true,但你可以这样做:

Select Case msg.GetType.Name
    Case GetType(ClassA).Name
        ...
    Case GetType(ClassB).Name
        ...
    Case Else
        ...
End Select
Run Code Online (Sandbox Code Playgroud)

哪个看起来比这个干净一点:

If msg.GetType Is GetType(ClassA) Then
    ...
ElseIf msg.GetType Is GetType(ClassB) Then
    ...
Else
    ...
End If
Run Code Online (Sandbox Code Playgroud)