Есть ли причина предпочитать переключение над оператором if только с одним условием?
-
08-07-2019 - |
Вопрос
Я нашел следующий код в проекте моей команды:
Public Shared Function isRemoteDisconnectMessage(ByRef m As Message)
isRemoteDisconnectMessage = False
Select Case (m.Msg)
Case WM_WTSSESSION_CHANGE
Select Case (m.WParam.ToInt32)
Case WTS_REMOTE_DISCONNECT
isRemoteDisconnectMessage = True
End Select
End Select
End Function
Не берите в голову, что у функции нет возвращаемого типа (я могу легко добавить 'As Boolean'); что меня интересует, может ли быть какая-либо причина, чтобы предпочесть вышеприведенный код следующему (для меня гораздо более читабельному) коду?
Public Shared Function isRemoteDisconnectMessage(ByRef m As Message) As Boolean
Return m.Msg = WM_WTSSESSION_CHANGE AndAlso _
m.WParam.ToInt32() = WTS_REMOTE_DISCONNECT
End Function
Чтобы сформулировать вопрос в общих чертах: имеет ли смысл использовать блок switch
(или, в данном случае, Select Case
) - и / или вложенный блоки - проверить одно условие? Возможно ли это быстрее, чем простой if
?
Решение
Если вы беспокоитесь о производительности ... профиля. В противном случае вы не ошибетесь с ошибкой на читабельности ...
Другие советы
Я не верю, что это действительно имеет значение с точки зрения скорости, компилятор должен быть в состоянии оптимизировать это. Р>
Я думаю, что это просто вопрос предпочтений.
Мое эмпирическое правило - использовать оператор switch, если число условий if / else больше трех. У меня нет никаких данных о том, почему это имеет смысл, кроме того, что удобочитаемость / ремонтопригодность, по-видимому, уменьшаются по мере увеличения числа условий if / else.
Я думаю, что ответ в конкретном случае, который вы дали, - «нет» - он не имеет смысла, как предлагается в других ответах, можно надеяться, что компиляторы оптимизируют любые практические различия.
Я бы потратил деньги на то, чтобы код был немного вырезан, вставлен и удален - взял обобщенный набор вложенных операторов регистра и извлек один бит, который дает вам результат да / нет, который вам нужен.
Если бы это было что-то похожее в строке и / или был вызов функции, где установлен флаг возврата, то можно, возможно, оказаться в точке, где можно было бы начать обосновывать это, но не так, как есть. р>