Конструкция Select Case
 
Автор rdc

Блок Select Case может рассматриваться как оптимизированный If-ElseIf и работает так же. Стандартный Select Case можно использовать для любых стандартных типов данных в <expression> , а специализированный формат Select Case As Const оптимизирован для целочисленных значений.

Этот фрагмент кода показывает синтаксис стандартного select case. Expression (выражение) — это переменная, которая может быть любым из стандартных типов данных или отдельных элементов типа или массива.

Select Case <expression>
    Case <list>
        <statement> 
        <statement>
        ...
    Case Else
        <statement>
        <statement>
        ...
End Select


<list> - положение оператора Case может быть любым из следующих форматов.

Case <value>: значение, является одним из поддерживаемых типов данных или перечисления.
Case <value> To <value>: определяет диапазон значений.
Case Is <operator> <value>: operator — любой из перечисленных логических операторов.
Case <value>, <value>, ...: список значений, разделенных запятыми.
Case <variable>: переменная, содержащая значение.

В следующем фрагменте показано, как эти различные форматы могут быть использованы в программе.

Case 47

Case 47 To 59

Case Is > 60

Case 47, 48, 53

Case keycode


Select Case As Const более быстрая версия Select заявления, работающая с integer выражениями в диапазоне 0 - 4097.

Select Case As Const <integer_expression>
    Case <list>
        <statement> 
        <statement>
        ...
    Case Else
        <statement>
        <statement>
        ...
End Select


<list> заявленный формат для Select Case As Const , ограниченный значениями или перечислением значений. То есть, оператор выражения не допускаются в пределах Case As Const.

Когда блок Case выполняется, следующие инструкции после ключевого слова Case до следующего Case (или End Select) будут выполнены. В любой момент времени , только один блок Case может быть выполнен. Если Case Else присутствует и <expression> не соответствует ни одному Case, тогда будут выполняться инструкции после Case else. Следующая программа иллюстрирует использование блоков оператора Select Case.

'Ascii код клавиши
Dim As Integer keycode

'Цикл работает пока не нажата клавиша esc
Do
    keycode = Asc(Inkey)
    Select Case As Const keycode
        Case 48 To 57
            Print "You pressed a number key."
        Case 65 To 90
            Print "You pressed an upper case letter key."
        Case 97 To 122
            Print "You pressed a lower case key."
        End Select
        Sleep 1
Loop Until keycode = 27 '27 - ascii код для Escape

End


В программе при нажатии клавиши, значение переводится в число, используя функцию Asc. Поскольку всегда будет целое значение, которое является менее 4097 (с диапазоном символов ascii кодов от 0 до 255), используется Select Case As Const формат.

Компилятор будет проверять значение keycode в диапазоне значений, для того, чтобы определить какой блок нужно выполнить. Если keycode попадает в пределы определенного диапазона, будет выполняться соответствующая инструкция Print, и далее поток программы продолжится со следующей строки после End Select. Если keycode не соответствует ни одному из предложенных диапазонов, то программа будет продолжаться со следующей строки после End Select.

Select Case может легко транслироваться в If-Elseif. Чтобы проиллюстрировать это, предыдущую программу мы перепишем с помощью If-ElseIf.

'Ascii код клавиши
Dim As Integer keycode

'Цикл работает пока не нажата клавиша esc
Do
    keycode = Asc(Inkey)
    If (keycode >= 48) And (keycode <= 57) Then
        Print "You pressed a number key."
    ElseIf (keycode >= 65) And (keycode <= 90) Then
        Print "You pressed an upper case letter key."
    ElseIf (keycode >= 97) And (keycode <= 122) Then
        Print "You pressed a lower case key."
    End If
    Sleep 1
Loop Until keycode = 27 '27 - ascii код для Escape

End


Если вы сравните две программы, вы можете увидеть, что логика очень похожа, однако использование Select Case является гораздо более читаемым и понятным, чем If-ElseIf.