Declarando variáveis ​​de retorno nos métodos c # versus retornando o valor diretamente

17

Em um debate sobre variáveis ​​de retorno, alguns membros da equipe preferem um método para retornar o resultado diretamente ao chamador, enquanto outros preferem declarar uma variável de retorno que é retornada ao chamador (veja exemplos de código abaixo)

O argumento para o último é que ele permite que um desenvolvedor que esteja depurando o código encontre o valor de retorno do método antes de retornar ao chamador, facilitando assim a compreensão do código: Isso é especialmente verdade quando as chamadas de método são encadeadas.

Existem diretrizes sobre qual é a mais eficiente e / ou existem outras razões pelas quais devemos adotar um estilo em detrimento de outro?

obrigado

    private bool Is2(int a)
    {
        return a == 2;
    }

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }
pb01
fonte
11
Ambos os exemplos serão compilados para o IL idêntico. O único motivo pelo qual você deseja o segundo exemplo é para fins de depuração ou se precisar usá- resultlo antes de devolvê-lo.
ChrisF
1
Outro motivo seria porque você precisa fazer outra coisa entre calcular o resultado e devolvê-lo.
Tâmara # 03:
1
@ ChrisF, na verdade eles não compilam a mesma IL para mim (há mais stloc.0e ldloc.0na segunda versão). Mas acho que isso acontece apenas no modo de depuração. E não é realmente importante aqui de qualquer maneira.
svick
@svick - OK - eu deveria ter adicionado "no modo de lançamento";) #
ChrisF
1
Como você pode e, às vezes, deve (por uma questão de brevidade) escrever algo que se parece com: a = b = c;e a == b == c, eu evitaria escrever algo que se parecesse a = b == cse você puder. Quando vi pela primeira vez uma linha de código assim, levei alguns segundos para descobrir o que estava acontecendo. Esse código se destacou. Gostaria de dar um tapa entre parênteses a == 3, mas o StyleCop não gosta - um bom motivo para usar a versão número um. Outra coisa: isso é essencialmente um lambda, como a => (a == 3). Por que adicionar uma linha de código a uma função trivial já inchada?
Job

Respostas:

7

Como eu uso o Resharper com o Visual Studio, Ctrl-RV (ou Ctrl-Alt-V, se você usar as associações de teclas Resharper / IntelliJ) transforma seu primeiro exemplo em seu segundo exemplo. Então, quando eu quero depurar, posso fazer isso com bastante facilidade. E se eu esquecer de colocá-lo de volta, não me sentirei mal porque o Ctrl-RI o colocará de volta novamente para facilitar a leitura.

Sério, desperdice seu tempo discutindo sobre coisas mais importantes. Como onde colocar seus chaves ou espaços principais versus abas.

pdr
fonte
5
Eu prefiro meus debates que ser sobre personagens invisíveis ...
ChaosPandion
Ótima dica, pessoal! Agora podemos fatorar continuamente o código um do outro muito mais rapidamente do que antes. Provavelmente economizará mais tempo do que realmente discuti-lo! :)
PB01
@pdr que ctrl + RV funciona apenas com o recarregador? ou é algum tipo de atalho de teclado personalizado? Isto não funciona para mim.
Jane Doe
@ JaneDoe: Estou surpreso ao descobrir que é uma refatoração de Resharper e que o VS não tem um equivalente. Resposta corrigida. Me desculpe por isso.
PDR
@ChaosPandion U + 200B pela vitória!
Jesse C. Slicer
18

Pessoalmente, acho o primeiro exemplo mais fácil de ler. Você ainda pode depurá-lo, definindo um ponto de interrupção na declaração de retorno e adicionando a == 2à janela de inspeção ou usando a verificação rápida.

Mas isso é realmente uma questão de preferência pessoal. Ambas as versões estão OK.

Olivier Jacot-Descombes
fonte
8
Marcar um código com mais dificuldade para ler o código para facilitar a colocação de pontos de interrupção é fazer as coisas da maneira errada na imho
jk.
A janela de inspeção ou a janela intermediária nem sempre são soluções para esse problema, pois às vezes a expressão exige que o encadeamento seja executado.
JustAnotherUserYouMayKnowOrNot
@JustAnotherUserYouMayKnowOrNot: Sim. Também há a possibilidade de imprimir uma mensagem na janela de depuração de dentro de um ponto de interrupção. Clique com o botão direito do mouse no ponto de interrupção e selecione "When Hit ...".
Olivier Jacot-Descombes 17/03/2013
Além disso, a expressão pode ter efeitos colaterais, executá-la novamente pode resultar em problemas. Melhor ficar com o resultado var.
JustAnotherUserYouMayKnowOrNot
9

Quando o código é tão facilmente legível como o seu exemplo, não há nada errado em retornar o resultado de uma operação lógica como return a == 2. No entanto, se o valor de retorno for uma declaração mais complexa ou se parecer com algo como

return a > 2? doOptionA().getResult() > makeDecision("greaterThan2") : doOptionB().getResult() == makeDecision("lessThan2");

convém usar variáveis ​​para armazenar partes disso primeiro e simplificar a declaração de retorno, para facilitar a leitura.

CFL_Jeff
fonte
2

Em um exemplo simples como esse, qualquer um deles está OK.

Para exemplos mais complicados, prefiro a segunda maneira. Isso é apenas porque é mais legível e outros provavelmente terão que manter o código.

Alan Delimon
fonte
Somente se houver um nome de variável melhor que result, que por si só é um identificador completamente não descritivo e inútil.
Alexander - Restabelece Monica