从“选择......案例”声明中省略“案例”

时间:2013-09-06 17:30:29

标签: vb.net syntax

这不是一个真正的问题,但更多的是我的好奇心,我无法通过自己的方式解决。我肯定不会失去任何睡眠。

在VB.NET中,switch语句的语法是(如MSDN here中所述):

Select [ Case ] testexpression
[ Case expressionlist
    [ statements ] ]
[ Case Else
    [ elsestatements ] ]
End Select

请注意,在第一行中,Case位于方括号中,表示它是可选的。

事实上,以下示例的编译和执行方式与至少在我尝试过的基本示例中包含Case关键字的方式相同:

Select myIntVar
    Case 0
        Return "Nothing"
    Case 1
        Return "Just one"
    Case Else
        Return "Something else"
End Select

因此我的问题如下: 除了语法之外,在使用SelectSelect Case打开switch语句之间是否存在任何差异?

4 个答案:

答案 0 :(得分:6)

我做了一个小实验。我编写了一个像这样的小型控制台应用程序:

Module Module1

    Sub Main()
        Dim myStr As String = GetString(1)
    End Sub

    Private Function GetString(myIntVar) As String
        Select myIntVar
            Case 0
                Return "Nothing"
            Case 1
                Return "Just one"
            Case Else
                Return "Something else"
        End Select
    End Function

End Module

第一次运行如上图所示,然后我再次插入Case关键字进行编译。我使用ILDasm反汇编了两个已创建的可执行文件,并将GetString函数的IL粘贴到此在线差异网站中:http://www.diffchecker.com/9ef7z423

在我看来,Select Case和普通的Select纯粹是语法上的差异(这当然不包括LINQ查询中Select的用法)。

答案 1 :(得分:2)

我想说这两种形式之间存在 no 差异。但是,我唯一的证据是没有任何区别。而不是查看语言参考,看看的最终位置是Language Specification 1

在版本11中,在10.8.2节下,讨论了Select Case语句,显示的语法是:

  

SelectStatement :: =
    Select [Case] 表达式 StatementTerminator
    [ CaseStatement +]
    [ CaseElseStatement ]
    End Select StatementTerminator

因此,很明显,本节确实涵盖了两种形式。但是,在前面5段(选择案例陈述的整个规范)中,两种形式之间没有区别。

1 Reference试图描述性,给出示例,并使用(有时)更宽松的语言。应该遵循规范来创建Visual Basic编译器。如果前者缺少某些东西,那么它可能只是一个遗漏。如果后者缺少某些东西,那么它就不是该语言的正式部分。

答案 2 :(得分:1)

我认为这来自VB 6.0,其中Select Case是强制性的 - Select本身并不是一个声明。这意味着它现在只是归结为VB.NET中的个人偏好。

编辑:奇怪的是,如果您选择省略它,Visual Studio会自动添加它。

答案 3 :(得分:0)

在语言之间,例如VB和C#

,可能只是语法差异

switch语句需要关键字break才能打破循环。

在差异方面无法想到任何重大内容......抱歉。