Frage

So kam ich auf einige Code an diesem Morgen, der so aussah:

try
{
    x = SomeThingDangerous();
    return x;
}
catch (Exception ex)
{
    throw new DangerousException(ex);
}
finally
{
    CleanUpDangerousStuff();
}

Nun stellt dieser Code in Ordnung und funktioniert wie es sollte, aber es fühlt sich einfach nicht richtig aus einem try-Block zurückzukehren, vor allem, wenn eine da ist assoziiert schließlich.

Mein Hauptproblem ist, was passiert, wenn die schließlich eine Ausnahme von seinem eigenen wirft? Sie haben eine Variable zurückgegeben bekam aber auch eine Ausnahme zu behandeln ... also bin ich daran interessiert zu wissen, was andere denken über innerhalb eines Try-Block zurückzukehren?

War es hilfreich?

Lösung

Nein, es ist keine schlechte Praxis. Putting return, wo es Sinn verbessert die Lesbarkeit und Wartbarkeit und macht den Code einfacher zu verstehen macht. Sie sollten sich nicht sorgen, wie finally Block ausgeführt wird erhalten, wenn eine return Anweisung angetroffen wird.

Andere Tipps

Die schließlich ausgeführt wird, egal was passiert, so dass es keine Rolle spielt.

Persönlich würde ich diese Art der Codierung vermeiden, wie ich return-Anweisungen nicht das Gefühl, bevor sie schließlich Aussagen wie zu sehen.

Mein Geist ist einfach und es Dinge eher linear verarbeiten. Deshalb, wenn ich durch den Code für den Trockenlauf laufe, werde ich Tendenz zu denken, dass, sobald ich die return-Anweisung erreichen kann, alles folgt egal, welche offensichtlich in diesem Fall ziemlich falsch ist (nicht, dass es die return-Anweisung beeinflussen würde aber was die Nebenwirkungen sein könnten).

So würde ich den Code so anordnen, dass die return-Anweisung immer nach den schließlich Aussagen erscheinen.

Dies kann die Antwort auf Ihre Frage

Was passiert wirklich in einem try {return x; schließlich} {x = null; } Aussage?

Aus der Lektüre diese Frage es klingt wie Sie eine neue Versuch Fangstruktur in der finally-Anweisung haben, wenn Sie denken, es könnte eine Ausnahme werfen. Der Compiler wird herauszufinden, wann der Wert zurückzukehren.

Das heißt, könnte es besser sein, Ihren Code zu restrukturieren sowieso nur so es Sie nicht verwirren später oder jemand anderes, auch dies nicht bewusst sein kann.

Funktional gibt es keinen Unterschied.

Allerdings gibt es einen Grund für dies nicht zu tun. Längere Verfahren mit mehreren Austrittsstellen sind oft schwieriger zu lesen und zu analysieren. Aber diese Einwand hat mehr mit Rück Aussagen als Fang- und schließlich Blöcke zu tun.

In Ihrem Beispiel entweder Weise entspricht, würde ich nicht einmal überrascht, wenn der Compiler den gleichen Code erzeugt. Wenn eine Ausnahme in der geschieht schließlich blockieren Sie die gleichen Probleme haben, ob Sie die Return-Anweisung in Block oder außerhalb davon setzen.

Die eigentliche Frage ist stilistisch, was am besten ist. Ich mag meine Methoden schreiben, so dass es nur eine return-Anweisung ist, auf diese Weise ist es einfacher, den Fluss aus dem Verfahren, um zu sehen, folgt daraus, dass Ich mag auch zuletzt die return-Anweisung setzen, so ist es leicht zu sehen, dass es das Ende des Verfahrens und das, was er zurückkehrt.

ich mit der return-Anweisung denke so ordentlich wie die letzte Anweisung gegeben, andere sind weniger wahrscheinlich zu kommen und zu streuen mehrere kehren Aussagen in andere Teile des Verfahrens.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top