Existe uma razão para preferir um interruptor sobre uma declaração se com apenas uma condição?
-
08-07-2019 - |
Pergunta
Eu encontrei o seguinte código no projecto da minha equipe:
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
Nunca mente que a função não tem um tipo de retorno (I pode facilmente adicionar 'As Boolean'); o que eu estou querendo saber é, poderia haver alguma razão para preferir o acima sobre o seguinte (para mim, muito mais legível) código?
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
Para colocar a questão em termos gerais: Será que faz sentido usar um switch
(ou, neste caso, Select Case
) bloquear - e / ou blocos aninhados - para testar uma única condição? É este, possivelmente, mais rápido que um if
simples?
Solução
Se você está preocupado com o desempenho ... perfil. Caso contrário, você não pode ir errante errado no lado de legibilidade ...
Outras dicas
Eu não acredito que realmente importa em termos de velocidade, o compilador deve ser capaz de otimizá-lo.
Eu acho que seria apenas uma questão de preferência.
Minha regra de ouro é usar uma instrução switch quando o número de if / else condições é maior do que três. Eu não tenho quaisquer dados por trás por isso faz sentido que não seja a legibilidade / manutenção parece diminuir à medida que o número de if / else condições aumenta.
Eu acho que a resposta no caso específico que você deu não é - não faz sentido, como sugerido em outras respostas que seria de esperar que os compiladores seria otimizar afastado qualquer diferenças práticas
.Eu colocaria dinheiro em este ser um pouco de corte, cole e excluir codificação -. Tomar um conjunto generalizado de instruções case aninhados e extrair que um pouco que lhe dá o sim / não resultar você precisa
Se isto fosse algo similar em linha e / ou houve uma chamada de função, onde a bandeira de retorno é definido, então se poderia, possivelmente, estar em um ponto onde se podia começar a justificá-la, mas não como ela é.