Déclaration des variables de retour dans les méthodes c # vs retour de la valeur directement

17

Dans un débat sur les variables de retour, certains membres de l'équipe préfèrent une méthode pour retourner le résultat directement à l'appelant, tandis que d'autres préfèrent déclarer une variable de retour qui est ensuite renvoyée à l'appelant (voir les exemples de code ci-dessous)

L'argument pour ce dernier est qu'il permet à un développeur qui débogue le code de trouver la valeur de retour de la méthode avant qu'il ne revienne à l'appelant, ce qui rend le code plus facile à comprendre: Cela est particulièrement vrai lorsque les appels de méthode sont connectés en guirlande.

Existe-t-il des directives pour déterminer laquelle est la plus efficace et / ou existe-t-il d'autres raisons pour lesquelles nous devrions adopter un style plutôt qu'un autre?

Merci

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

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }
pb01
la source
11
Les deux exemples seront compilés dans l'IL identique. La seule raison pour laquelle vous voulez le deuxième exemple est à des fins de débogage ou si vous devez l'utiliser resultavant de le renvoyer.
ChrisF
1
Une autre raison serait que vous devez faire autre chose entre le calcul du résultat et son retour.
tdammers
1
@ChrisF, en fait, ils ne compilent pas pour le même IL pour moi (il y en a d'autres stloc.0et ldloc.0dans la deuxième version). Mais je pense que cela ne se produit qu'en mode débogage. Et ce n'est pas vraiment important ici de toute façon.
svick
@svick - OK - j'aurais dû ajouter "en mode release";)
ChrisF
1
Puisque vous pouvez et devez parfois (par souci de concision) écrire quelque chose qui ressemble à: a = b = c;et a == b == c, j'éviterais d'écrire quelque chose qui ressemble a = b == csi vous le pouvez. Quand j'ai vu pour la première fois une ligne de code comme ça, il m'a fallu quelques secondes pour comprendre ce qui se passait. Ce code s'est démarqué. Je voudrais gifler les parenthèses a == 3, mais StyleCop ne l'aime pas - une bonne raison d'utiliser la version numéro un. Autre chose: c'est essentiellement un lambda, comme a => (a == 3). Pourquoi ajouter une ligne de code à une fonction triviale déjà gonflée?
Job

Réponses:

7

Étant donné que j'utilise Resharper avec Visual Studio, Ctrl-RV (ou Ctrl-Alt-V, si vous utilisez les liaisons de touches Resharper / IntelliJ) transforme votre premier exemple en votre deuxième exemple. Donc, quand je veux déboguer, je peux le faire assez facilement. Et si j'oublie de le remettre, je ne me sentirai pas mal parce que Ctrl-RI le remettra à nouveau pour le rendre plus facile à lire.

Sérieusement, perdez votre temps à discuter de choses plus importantes. Comme où placer vos accolades ou espaces principaux par rapport aux onglets.

pdr
la source
5
Je préfère que mes débats
portent
Bon conseil, les gars! Maintenant, nous pouvons continuellement re-factoriser le code les uns des autres beaucoup plus rapidement qu'auparavant. Cela vous fera probablement gagner plus de temps que d'en discuter! :)
pb01
@pdr est-ce que ctrl + RV fonctionne uniquement avec resharper? ou s'agit-il d'une sorte de raccourci clavier personnalisé? ça ne marche pas pour moi.
Jane Doe
@JaneDoe: Je suis stupéfait de constater qu'il s'agit d'un refactoring Resharper et que VS n'a pas d'équivalent. Réponse corrigée. Désolé pour ça.
pdr
@ChaosPandion U + 200B pour la victoire!
Jesse C. Slicer
18

Personnellement, je trouve le premier exemple plus facile à lire. Vous pouvez toujours le déboguer, en définissant un point d'arrêt dans l'instruction de retour et en l'ajoutant a == 2à la fenêtre de surveillance ou en utilisant la surveillance rapide.

Mais c'est vraiment une question de préférence personnelle. Les deux versions sont OK.

Olivier Jacot-Descombes
la source
8
+1 redresser plus difficile à lire le code pour faciliter le placement des points d'arrêt, c'est faire les choses à l'envers imho
jk.
La fenêtre de surveillance ou la fenêtre intermédiaire ne sont pas toujours des solutions à ce problème, car l'expression nécessite parfois l'exécution du thread.
JustAnotherUserYouMayKnowOrNot
@JustAnotherUserYouMayKnowOrNot: Oui. Il existe également la possibilité d'imprimer un message dans la fenêtre de débogage à partir d'un point d'arrêt. Cliquez avec le bouton droit sur le point d'arrêt et sélectionnez "Lorsque vous frappez ...".
Olivier Jacot-Descombes
L'expression peut également avoir des effets secondaires, la relancer peut entraîner des problèmes. Mieux vaut coller avec le résultat var.
JustAnotherUserYouMayKnowOrNot
9

Lorsque le code est aussi facilement lisible que votre exemple, il n'y a rien de mal à renvoyer le résultat d'une opération logique telle que return a == 2. Cependant, si la valeur de retour est une instruction plus complexe ou ressemble à quelque chose comme

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

alors vous voudrez utiliser des variables pour stocker des morceaux de cela en premier et simplifier l'instruction de retour, pour des raisons de lisibilité.

CFL_Jeff
la source
2

Dans un exemple simple comme celui-là, l'un ou l'autre est OK.

Pour des exemples plus compliqués, je préfère la deuxième voie. C'est seulement parce qu'il est plus lisible et que d'autres devront probablement maintenir le code.

Alan Delimon
la source
Seulement s'il y a un meilleur nom de variable que result, qui est lui-même un identifiant complètement non descriptif et inutile.
Alexander - Reinstate Monica