Есть ли причина предпочитать переключение над оператором if только с одним условием? - PullRequest
1 голос
/ 28 октября 2009

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

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?

Ответы [ 4 ]

4 голосов
/ 28 октября 2009

Если вы беспокоитесь о производительности ... профиля. В противном случае вы не ошибетесь с ошибкой на стороне читабельности ...

2 голосов
/ 28 октября 2009

Я не верю, что это действительно имеет значение с точки зрения скорости, компилятор должен быть в состоянии оптимизировать это.

Я думаю, что это просто вопрос предпочтений.

1 голос
/ 28 октября 2009

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

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

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

1 голос
/ 28 октября 2009

Мое эмпирическое правило заключается в использовании оператора switch, когда число условий if / else больше трех. У меня нет никаких данных о том, почему это имеет смысл, кроме того, что удобочитаемость / ремонтопригодность, похоже, уменьшаются по мере увеличения числа условий if / else.

...