Опускание "случая" из заявления "Выбрать... случай"
На самом деле это не проблема, а больше мое любопытство, которое я не смог решить своими силами. Я наверняка не потеряю сон над ним.
В 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
Поэтому мой вопрос таков:
Помимо синтаксиса, существует ли разница между открытием оператора switch с помощью Select
и Select Case
?
Ответы
Ответ 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
и вставил IL функции GetString
в этот онлайн-сайт: http://www.diffchecker.com/9ef7z423
Мне кажется, что Select Case
и простой старый Select
являются чисто синтаксическими различиями (это, конечно, исключает использование Select
в запросах LINQ).
Ответ 2
Я бы сказал, что между двумя формами существует нет. Однако мои единственные доказательства - это отсутствие какого-либо различия. Вместо того, чтобы смотреть на справочник по языку, окончательное место для поиска находится в Спецификация языка 1.
В версии 11 в разделе 10.8.2 обсуждается оператор Select Case, и показан синтаксис:
SelectStatement:: =
Select
[Case
] Выражение StatementTerminator
[CaseStatement +]
[CaseElseStatement]
End Select
StatementTerminator
Итак, ясно, что этот раздел охватывает обе формы. Однако в предыдущих 5 параграфах (в полном объеме спецификации для операторов Select Case) между этими двумя формами не проводится различие.
1 Ссылка пытается описать, привести примеры и использовать (порой) более свободный язык. Спецификация должна быть последовательной для создания компилятора Visual Basic. Если что-то отсутствует в первом, то это может быть просто упущение. Если что-то отсутствует в последнем, то это официально не является частью языка.
Ответ 3
Я думаю, что это происходит от VB 6.0, где Select Case
был обязательным - Select
не был сам по себе. Это означало бы, что теперь это просто до личного предпочтения в VB.NET.
Изменить. Как ни странно, если вы решили опустить его, Visual Studio добавит его автоматически.
Ответ 4
Может быть, это просто разница в синтаксисе между языками, такими как VB и С#
оператор switch требует разрыва ключевого слова, чтобы вырваться из цикла.
Не могу придумать ничего серьезного, с точки зрения различий... извините.