Rückgabevariablen in c # -Methoden deklarieren oder den Wert direkt zurückgeben


16

In einer Debatte über Rückgabevariablen bevorzugen einige Mitglieder des Teams eine Methode, um das Ergebnis direkt an den Aufrufer zurückzugeben, während andere es vorziehen, eine Rückgabevariable zu deklarieren, die dann an den Aufrufer zurückgegeben wird (siehe Codebeispiele unten).

Das Argument für Letzteres ist, dass ein Entwickler, der den Code debuggt, den Rückgabewert der Methode finden kann, bevor er zum Aufrufer zurückkehrt, wodurch der Code besser verständlich wird: Dies gilt insbesondere, wenn Methodenaufrufe in einer Kette vorliegen.

Gibt es Richtlinien, welche am effizientesten sind, und / oder gibt es andere Gründe, warum wir einen Stil über einen anderen stellen sollten?

Vielen Dank

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

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }

11
Beide Beispiele werden zur identischen IL kompiliert. Der einzige Grund, warum Sie das zweite Beispiel verwenden möchten, ist das Debuggen oder das Verwenden, resultbevor Sie es zurückgeben.
ChrisF

1
Ein weiterer Grund wäre, dass Sie zwischen der Berechnung des Ergebnisses und der Rückgabe etwas anderes tun müssen.
Tdammers

1
@ ChrisF, eigentlich kompilieren sie nicht mit der gleichen IL für mich (es gibt zusätzliche stloc.0und ldloc.0in der zweiten Version). Aber ich denke, das passiert nur im Debug-Modus. Und hier ist es sowieso nicht wirklich wichtig.
Svick

@svick - OK - Ich hätte "im Veröffentlichungsmodus" hinzufügen sollen;)
ChrisF

1
Da Sie (der Kürze halber) manchmal etwas schreiben können und sollten, das aussieht wie: a = b = c;und a == b == c, würde ich es vermeiden, etwas zu schreiben, das aussieht, a = b == cwenn Sie können. Als ich zum ersten Mal eine solche Codezeile sah, brauchte ich ein paar Sekunden, um herauszufinden, was los ist. Dieser Code ragte heraus. Ich würde gerne Klammern setzen a == 3, aber StyleCop mag das nicht - ein guter Grund, Version eins zu verwenden. Noch etwas: Dies ist im Wesentlichen ein Lambda, wie z a => (a == 3). Warum einer bereits aufgeblähten Trivialfunktion eine Codezeile hinzufügen?
Job

Antworten:


7

Da ich Resharper mit Visual Studio verwende, verwandelt Ctrl-RV (oder Ctrl-Alt-V, wenn Sie die Resharper / IntelliJ-Tastenzuordnungen verwenden) Ihr erstes Beispiel in Ihr zweites Beispiel. Wenn ich also debuggen möchte, kann ich das leicht genug tun. Und wenn ich vergesse, es zurückzusetzen, fühle ich mich nicht schlecht, weil Strg-RI es wieder zurücksetzt, um das Lesen zu erleichtern.

Im Ernst, verschwenden Sie Ihre Zeit damit, über wichtigere Dinge zu streiten. Wie, wo Sie Ihre führenden Klammern oder Leerzeichen gegen Tabulatoren setzen.


5
Ich bevorzuge es, wenn es in meinen Debatten um unsichtbare Charaktere geht ...
ChaosPandion

Toller Tipp, Leute! Jetzt können wir den Code des jeweils anderen weitaus schneller als bisher neu faktorisieren. Es wird wahrscheinlich mehr Zeit sparen, als es tatsächlich zu diskutieren! :)
pb01

@pdr funktioniert Strg + RV nur mit Resharper? oder ist es eine Art benutzerdefinierte Tastenkombination? das klappt bei mir nicht
Jane Doe

@ JaneDoe: Ich bin fassungslos, dass es sich um ein Resharper-Refactoring handelt und VS kein Äquivalent hat. Antwort korrigiert. Das tut mir leid.
pdr

@ChaosPandion U + 200B für den Gewinn!
Jesse C. Slicer

18

Persönlich finde ich das erste Beispiel leichter zu lesen. Sie können es weiterhin debuggen, indem Sie einen Haltepunkt in der return-Anweisung setzen und zum Überwachungsfenster hinzufügen a == 2oder die Schnellüberwachung verwenden.

Aber das ist wirklich eine Frage der persönlichen Präferenz. Beide Versionen sind OK.


8
+1 härter aufrichtenden Code zu lesen zu erleichtern Platzierung Bruchstellen wird die Dinge falsch herum imho tun
jk.

Überwachungsfenster oder Zwischenfenster sind nicht immer Lösungen für dieses Problem, da der Ausdruck manchmal die Ausführung des Threads erfordert.
JustAnotherUserYouMayKnowOrNot

@ JustAnotherUserYouMayKnowOrNot: Ja. Es besteht auch die Möglichkeit, eine Nachricht aus einem Haltepunkt in das Debug-Fenster zu drucken. Klicken Sie mit der rechten Maustaste auf den Haltepunkt und wählen Sie "Bei Treffer ...".
Olivier Jacot-Descombes

Auch der Ausdruck kann Nebenwirkungen haben, und das erneute Ausführen kann zu Problemen führen. Bleib lieber beim Ergebnis var.
JustAnotherUserYouMayKnowOrNot

9

Wenn der Code so leicht lesbar ist wie in Ihrem Beispiel, ist es nichts Falsches, das Ergebnis einer logischen Operation zurückzugeben, wie z return a == 2. Wenn der Rückgabewert jedoch eine komplexere Anweisung ist oder wie folgt aussieht

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

Dann sollten Sie Variablen verwenden, um Teile davon zu speichern und die return-Anweisung aus Gründen der Lesbarkeit zu vereinfachen.


2

In einem einfachen Beispiel wie diesem ist beides in Ordnung.

Für kompliziertere Beispiele bevorzuge ich den zweiten Weg. Das liegt nur daran, dass es besser lesbar ist und andere den Code wahrscheinlich warten müssen.


Nur wenn es einen besseren Variablennamen gibt als result, der selbst ein völlig unbeschreiblicher und unbrauchbarer Bezeichner ist.
Alexander - Reinstate Monica
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.