Deklarowanie zmiennych zwracanych w metodach c # vs zwracanie wartości bezpośrednio

17

W debacie dotyczącej zmiennych zwracanych niektórzy członkowie zespołu wolą metodę zwracania wyniku bezpośrednio do dzwoniącego, podczas gdy inni wolą zadeklarować zmienną zwrotną, która jest następnie zwracana do dzwoniącego (patrz przykłady kodu poniżej)

Argumentem tego drugiego jest to, że pozwala programistom debugującym kod znaleźć wartość zwracaną przez metodę, zanim powróci ona do programu wywołującego, ułatwiając w ten sposób zrozumienie kodu: Jest to szczególnie prawdziwe, gdy wywołania metod są połączone szeregowo.

Czy istnieją jakieś wytyczne dotyczące tego, który jest najbardziej wydajny i / lub czy istnieją inne powody, dla których powinniśmy stosować jeden styl nad drugim?

Dzięki

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

    private bool Is3(int a)
    {
        var result = a == 3;
        return result;
    }
pb01
źródło
11
Oba przykłady zostaną skompilowane do identycznej IL. Jedyny powód, dla którego chcesz użyć drugiego przykładu, to do celów debugowania lub jeśli musisz go użyć resultprzed jego zwróceniem.
ChrisF
1
Innym powodem może być to, że musisz zrobić coś innego między obliczeniem wyniku a jego zwróceniem.
tdammers
1
@ChrisF, w rzeczywistości nie kompilują się dla tej samej IL dla mnie (jest dodatkowa stloc.0iw ldloc.0drugiej wersji). Ale myślę, że dzieje się to tylko w trybie debugowania. Poza tym i tak nie jest to tak naprawdę ważne.
sick
@svick - OK - Powinienem dodać „w trybie wydania”;)
ChrisF
1
Ponieważ możesz i czasami powinieneś (ze względu na zwięzłość) napisać coś, co wygląda: a = b = c;i a == b == cunikałbym pisania czegoś, co wygląda, a = b == cjeśli możesz. Kiedy po raz pierwszy zobaczyłem taki wiersz kodu, zajęło mi kilka sekund, aby dowiedzieć się, co się dzieje. Ten kod wyróżniał się. Chciałbym a == 3obrócić nawias , ale StyleCop go nie lubi - dobry powód, aby użyć wersji numer jeden. Coś innego: jest to w zasadzie lambda, na przykład a => (a == 3). Po co dodawać wiersz kodu do już rozdętej, trywialnej funkcji?
Job

Odpowiedzi:

7

Ponieważ używam Resharpera z Visual Studio, Ctrl-RV (lub Ctrl-Alt-V, jeśli używasz powiązania klawiszy Resharper / IntelliJ) zamienia twój pierwszy przykład w drugi. Więc kiedy chcę debugować, mogę to zrobić dość łatwo. A jeśli zapomnę go odłożyć, nie będę się czuć źle, ponieważ Ctrl-RI ponownie go odłoży, aby ułatwić czytanie.

Poważnie, marnujcie czas na kłótnie o ważniejsze rzeczy. Na przykład, gdzie umieścić wiodące nawiasy klamrowe lub spacje vs.

pdr
źródło
5
Wolę, aby moje debaty dotyczyły niewidzialnych postaci ...
ChaosPandion
Świetna wskazówka, chłopaki! Teraz możemy stale przenosić na siebie kod znacznie szybciej niż wcześniej. Prawdopodobnie zaoszczędzi to więcej czasu niż faktyczna dyskusja! :)
pb01
@pdr czy ten ctrl + RV działa tylko z resharper? czy jest to jakiś niestandardowy skrót klawiszowy? nie działa mi.
Jane Doe
@JaneDoe: Jestem oszołomiony faktem, że jest to refaktoryzacja Resharpera i że VS nie ma odpowiednika. Odpowiedź poprawiona. Przepraszam za to.
pdr
@ChaosPandion U + 200B na zwycięstwo!
Jesse C. Slicer
20

Osobiście uważam, że pierwszy przykład jest łatwiejszy do odczytania. Nadal możesz go debugować, ustawiając punkt przerwania w instrukcji return i dodając a == 2do okna zegarka lub używając szybkiego zegarka.

Ale tak naprawdę jest to kwestia osobistych preferencji. Obie wersje są OK.

Olivier Jacot-Descombes
źródło
8
+1 prostującego trudniej odczytać kod do umieszczenia punkty przerwy łatwiej jest robić rzeczy w niewłaściwy sposób okrągłe IMHO
jk.
Okno podglądu lub okno pośrednie nie zawsze są rozwiązaniem tego problemu, ponieważ czasami wyrażenie wymaga uruchomienia wątku.
JustAnotherUserYouMayKnowOrNot
@JustAnotherUserYouMayKnowOrNot: Tak. Istnieje również możliwość wydrukowania wiadomości w oknie debugowania z poziomu punktu przerwania. Kliknij punkt przerwania prawym przyciskiem myszy i wybierz „Po trafieniu ...”.
Olivier Jacot-Descombes
Również wyrażenie może mieć skutki uboczne, jego ponowne uruchomienie może spowodować problemy. Lepszy kij z wynikiem var.
JustAnotherUserYouMayKnowOrNot 18.03.13
1
Dlaczego debuggery nie mogą po prostu pokazać wartości, gdy już najedziesz myszą na zwrot? Wygląda na to, że jest na stosie.
candied_orange
10

Gdy kod jest tak czytelny jak twój przykład, nie ma nic złego w zwróceniu wyniku operacji logicznej, takiej jak return a == 2. Jeśli jednak zwracana wartość jest bardziej złożoną instrukcją lub wygląda mniej więcej tak

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

wtedy będziesz chciał użyć zmiennych do przechowywania części tego pierwszego i uproszczenia instrukcji return ze względu na czytelność.

CFL_Jeff
źródło
2

W prostym przykładzie, takim jak ten, jedno jest OK.

Dla bardziej skomplikowanych przykładów wolę drugi sposób. Jest tak tylko dlatego, że jest bardziej czytelny, a inni prawdopodobnie będą musieli zachować kod.

Alan Delimon
źródło
Tylko jeśli istnieje lepsza nazwa zmiennej niż result, która sama w sobie jest całkowicie nieopisowym i bezużytecznym identyfikatorem.
Aleksander - Przywróć Monikę