【问题标题】:Omitting "Case" from "Select...Case" Statement从“Select...Case”语句中省略“Case”
【发布时间】:2013-09-06 17:30:28
【问题描述】:

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

在 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 语句是否有任何区别?

【问题讨论】:

  • 我想不到。如果MSDN 没有提及任何事情,人们可能会认为它没有。我不想假设...
  • 有趣的问题,我敢打赌“CASE”是可选的,因为它似乎与没有它的 C# switch 语句一致(也许“CASE”部分只是旧 vb 的遗留物),并且它可能在 CLR 中以相同的方式编译
  • 另一个有趣的方面是,尽管根据 MSDN,Case 是可选的,但如果您忽略它,Visual Studio 会自动为您添加它。

标签: vb.net syntax


【解决方案1】:

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

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)。

【讨论】:

  • 当然,如果您遗漏了有关该语言的一些细微差别(我认为您没有,正如我的回答所表明的那样),您可能会在没有暴露细微差别的情况下进行编译. IE。如果它确实有所作为,则可能是您的示例未使用的某些极端情况。
  • 以编程方式,VB.Net 会在运行时自动为您添加“案例”。所以你肯定会有同样的反应。
【解决方案2】:

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

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

SelectStatement ::=
Select [ Case ] 表达式 StatementTerminator
[ 案例陈述+ ]
[ CaseElseStatement ]
End Select StatementTerminator

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      也许这只是语法上的差异,在语言之间,例如 VB 和 C#

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

      就差异而言,我想不出任何重要的东西......对不起。

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 2013-03-23
        • 2014-12-05
        • 1970-01-01
        • 2015-02-27
        • 2014-03-30
        • 2012-05-07
        • 1970-01-01
        • 2016-05-02
        相关资源
        最近更新 更多