Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择对象上的大小写';VB.NET中的s类型_Vb.net_Switch Statement_Select Case - Fatal编程技术网

选择对象上的大小写';VB.NET中的s类型

选择对象上的大小写';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关

我不确定这个C是否有效,但希望你能理解

如果不使用VB.NET的
选择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
vs
Select Case
进行的简单性能测试证明
If/ElseIf
选项每次都更快。
Select Case
大约花费了4倍的时间。现在我将坚持使用
If/ElseIf
。谢谢-这允许在相同比较中检查两种不同类型时更简洁/更容易阅读代码,例如
Case-GetType(ClassA),GetType(ClassB)
vs
ElseIf-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