Опускание "случая" из заявления "Выбрать... случай"

На самом деле это не проблема, а больше мое любопытство, которое я не смог решить своими силами. Я наверняка не потеряю сон над ним.

В 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 требует разрыва ключевого слова, чтобы вырваться из цикла.

Не могу придумать ничего серьезного, с точки зрения различий... извините.