这不是一个真正的问题,但更多的是我的好奇心,我无法通过自己的方式解决。我肯定不会失去任何睡眠。
在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
因此我的问题如下:
除了语法之外,在使用Select
和Select Case
打开switch语句之间是否存在任何差异?
答案 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才能打破循环。
在差异方面无法想到任何重大内容......抱歉。