Есть ли причина предпочитать переключение над оператором if только с одним условием?

StackOverflow https://stackoverflow.com/questions/1638241

Вопрос

Я нашел следующий код в проекте моей команды:

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.

Я думаю, что ответ в конкретном случае, который вы дали, - «нет» - он не имеет смысла, как предлагается в других ответах, можно надеяться, что компиляторы оптимизируют любые практические различия.

Я бы потратил деньги на то, чтобы код был немного вырезан, вставлен и удален - взял обобщенный набор вложенных операторов регистра и извлек один бит, который дает вам результат да / нет, который вам нужен.

Если бы это было что-то похожее в строке и / или был вызов функции, где установлен флаг возврата, то можно, возможно, оказаться в точке, где можно было бы начать обосновывать это, но не так, как есть.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top