10

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

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

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

因此我的问题如下:除了语法之外,用and打开 switch 语句有什么区别吗?SelectSelect Case

4

4 回答 4

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并将函数的 IL 粘贴GetString到这个在线差异站点:http ://www.diffchecker.com/9ef7z423

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

于 2013-09-09T14:02:38.120 回答
2

我想说这两种形式没有区别。然而,我唯一的证据是没有做出任何区分。与其查看语言参考,不如查看语言规范1

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

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

因此,很明显,本节确实涵盖了这两种形式。但是,在前面的 5 段(Select Case Statements 的整个规范)中,没有对这两种形式进行区分。

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

于 2013-09-09T13:02:21.710 回答
1

我认为这来自Select Case强制要求的 VB 6.0——Select它本身并不是一个声明。这意味着它现在只取决于 VB.NET 中的个人偏好。

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

于 2013-09-10T10:09:27.560 回答
0

也许这只是语法上的差异,就语言而言,例如 VB 和 C#

switch 语句需要关键字 break 才能跳出循环。

就差异而言,想不出任何重大的事情......对不起。

于 2013-09-09T21:26:39.597 回答