Существует ситуация, когда Select Case может быть намного эффективнее, чем If: когда у вас есть список предложений «Or» в условии If и вам не нужно оценивать их все, чтобы установить истинность условия. Предположим, у вас есть оператор if, такой как:
If A() Or B() Then
DoSomething()
ElseIF C() or D() Then
DoSomethingElse()
Else
DoTheDefault()
EndIF
В этом случае для вычисления первого оператора if выполняются обе функции A () и B (), и аналогично для второго оператора if, когда A () и B () оба являются ложными. Если A () возвращает true, то значение B () является несущественным, и, если оно не изменяет состояние программы так, как вы этого хотите (обычно это не очень хорошая практика), выполнение B () является избыточным. Компилятор ограничен требованием, что все части теста ДОЛЖНЫ быть выполнены до заключения значения (оптимизация теста не допускается в соответствии со спецификацией языка).
Вы можете разделить условия на несколько операторов IfElse, чтобы оптимизировать его самостоятельно, но это делает код менее читабельным и увеличивает опасность ошибок при внесении изменений позже. Я считаю, что использование Select Case лучше в этой ситуации:
Select Case True
Case A(), B()
DoSomething()
Case C(), D()
DoSomethingElse()
Case Else
DoTheDefault()
End Select
Теперь, если A () возвращает True, тогда B () вообще не оценивается. Оценка условий производится в указанной последовательности, поэтому вы можете помочь оптимизировать код, разместив тесты в порядке наиболее вероятного возврата True или наименее затратного для выполнения (в зависимости от приложения).