选择对象上的大小写';VB.NET中的s类型
我不确定这个C是否有效,但希望你能理解 如果不使用VB.NET的选择对象上的大小写';VB.NET中的s类型,vb.net,switch-statement,select-case,Vb.net,Switch Statement,Select Case,我不确定这个C是否有效,但希望你能理解 如果不使用VB.NET的选择Case,如何打开对象的类型 我知道有些人可能建议使用,但我使用的是小型消息类的层次结构,因此在我的情况下确实不起作用。对于以.NET framework 4及更高版本为目标的项目,使用VB 2010,您现在可以执行以下操作: Select Case msg.GetType() Case GetType(ClassA) End Select 在早期的VB版本中,它不起作用,因为您无法比较两个相等的类型。您必须使用Is关
选择Case
,如何打开对象的类型
我知道有些人可能建议使用,但我使用的是小型消息类的层次结构,因此在我的情况下确实不起作用。对于以.NET framework 4及更高版本为目标的项目,使用VB 2010,您现在可以执行以下操作:
Select Case msg.GetType()
Case GetType(ClassA)
End Select
在早期的VB版本中,它不起作用,因为您无法比较两个相等的类型。您必须使用Is关键字检查它们是否指向相同的引用。在Select案例中不可能做到这一点,除非按照Michael的建议,使用Name或FullName等类型的属性进行比较。您可以使用If和ElseIf的组合:
Dim type = msg.GetType()
If type Is GetType(ClassA)
...
ElseIf type Is GetType(ClassB)
...
...
End If
如果您坚持使用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
但我想大多数人都喜欢避免这种事情。如果/ElseIf可能会更清楚。这:
Dim a As Object = New TextBox
Select Case True
Case TypeOf a Is TextBox
MsgBox("aaa")
Case TypeOf a Is ComboBox
Case TypeOf a Is ListBox
End Select
这是在同一个子系统中处理Button1和Button2单击事件的一种方法(我最初是作为VB6程序员,因此这是VB6处理控件数组的一个很好的替代品)
我不会选择case true,但您可以这样做:
Select Case msg.GetType.Name
Case GetType(ClassA).Name
...
Case GetType(ClassB).Name
...
Case Else
...
End Select
看起来比这更干净:
If msg.GetType Is GetType(ClassA) Then
...
ElseIf msg.GetType Is GetType(ClassB) Then
...
Else
...
End If
请不要做这种事!:)如果区块较短,我对此持矛盾态度。反对这段代码的论点是什么?事实上,这似乎一点也不坏,特别是当您可能有多个CASE(失败)时-这看起来比if语句好很多…我更喜欢CASE而不是嵌套IFs-在我看来更可读,更不容易出错。我使用SELECT CASE True。。。通常情况下,效果很好。我将使用
If
/ElseIf
s。有点糟糕的是,没有一种类似于交换机的方法来实现它。具体来说,这只适用于.NETFramework4及更高版本。您可以对此持保留态度,自己做性能测试:我自己对If/ElseIf
vsSelect Case
进行的简单性能测试证明If/ElseIf
选项每次都更快。Select Case
大约花费了4倍的时间。现在我将坚持使用If/ElseIf
。谢谢-这允许在相同比较中检查两种不同类型时更简洁/更容易阅读代码,例如Case-GetType(ClassA),GetType(ClassB)
vsElseIf-typeof-obj是ClassA或typeof-obj是ClassB,那么它可能更明显,但速度也要慢上百倍。但是,如果他真的想这样做的话,那就可以完成任务。@Bernesto-比什么慢一百倍?这个答案与公认的答案相同(我没有2010年的时间来测试类型相等的性能)。我不认为它应该是-1??If类型。Name不是完全限定的类型名。如果两个类具有相同的名称但位于不同的名称空间中,则可能会发生冲突。@MrShoubs“比什么慢一百倍?”您确实意识到,与公认的答案不同,后者只是比较类型实例,你的答案是为它们中的每一个创建字符串,然后比较它们?
Select Case msg.GetType.Name
Case GetType(ClassA).Name
...
Case GetType(ClassB).Name
...
Case Else
...
End Select
If msg.GetType Is GetType(ClassA) Then
...
ElseIf msg.GetType Is GetType(ClassB) Then
...
Else
...
End If