2009-08-03 8 views
8

Welche Art und Weise bessere Praxis ist: return Wert von einer Methode innerhalb einer using Anweisung oder eine Variable deklarieren, bevor, setzen Sie ihn innen und es nach der Rückkehr?Best Practice aus in Bezug auf Rückkehr mit Blöcken

public int Foo() 
{ 
    using(..) 
    { 
    return bar; 
    } 
} 

oder

public int Foo() 
{ 
    var b = null; 
    using(..) 
    { 
    b = bar; 
    } 
    return b; 
} 

Antwort

9

Ich bevorzuge das erste Beispiel. Weniger Variablen, weniger Codezeilen, einfacher zu folgen, einfacher zu warten ...

public int Foo() 
{ 
    using(..) 
    { 
    return bar; 
    } 
} 
2

Kein Grund, nicht zu, da diese using Aussage übersetzt in einen try...finally Block und der finally Teil garantiert ausgeführt werden (auch nicht durch eine Rückkehr oder eine nicht behandelte Ausnahme).

+1

Jemand muss immer darauf hinweisen - der finally Block ist * nicht * "garantiert" ausgeführt werden überhaupt. Es gibt gut definierte Umstände, unter denen es ausgeführt wird, und andere, wo es nicht ausgeführt wird. –

+1

Haben Sie einige Beispiele, wo es nicht geht? –

+1

@Earwicker: Wenn die Fälle, in denen es nicht ausgeführt wird, <0,01% sind, dann denke ich, dass es für die meisten Zwecke "garantiert" ist. –

1

Es kommt wirklich auf persönliche Vorlieben an. Sie werden auf beiden Seiten dieses Zauns Argumente finden. Ich bevorzuge Option 1: so schnell wie möglich zurückzukehren. Ich glaube, es drückt die Absicht des Codes besser aus; Es gibt keinen Grund länger zu bleiben als nötig. Wenn Sie alle Ihre Arbeit abgeschlossen haben, kehren Sie zurück.

Manchmal werden Sie mehrere mögliche Rückkehrpunkte haben, und „end-of-Methode“ Arbeit (Logging, Bereinigung), die Sie zu einer einzigen return-Anweisung führen könnte. Nichts Schreckliches daran, aber Sie können diese Situationen oft in finally Blöcken oder mit Aspekten in der aspektorientierten Programmierung behandeln.

+1

Ich stimme den persönlichen Vorlieben zu. Ich ziehe es vor, am Ende/Ende der Methode zurückzukehren. Codierungsrichtlinien diktieren dies oft auch. Das liegt wahrscheinlich auch daran, dass Methoden manchmal viel zu lang sind, was zu unlesbaren Methoden führt. Halte sie sehr kurz und deine Methoden sind wieder lesbar. Das ist also eine der Antworten, die ich schätze. ;) Betrachtet man sie von den besten Praktiken, afaik gibt es wirklich keinen, es ist eher eine Frage der Präferenz. –

5

Im Anschluss an die „weniger ist mehr“ -Prinzip (wirklich nur eine Variante von KISS), die ehemalige. Es gibt weniger zu wartende Codezeilen, keine Änderung der Semantik und keinen Verlust der Lesbarkeit (dieser Stil ist leichter lesbar).

5

Von using Statement - MSDN

Die using-Anweisung stellt sicher, dass entsorgen, auch wenn eine Ausnahme genannt wird auftritt, während Sie Methoden auf das Objekt aufrufen. Sie können das gleiche Ergebnis erzielen, indem das Objekt in einem Try-Block setzen und dann rief Entsorgen in einem finally-Block; in der Tat, ist, wie die using-Anweisung vom Compiler übersetzt wird.

Vom try-finally (C# Reference)

schließlich verwendet wird, eine Anweisung Codeblock zu gewährleisten führt unabhängig davon, wie der vorhergehende try-Block verlassen wird.

Um Ihre Frage zu beantworten, ja ist es okay, von einer using-Anweisung zurückzukehren.

+0

Er fragte, welche der oben genannten besser ist, nicht für die Semantik der using-Anweisung. Möglicherweise ist die Semantik hier relevant, aber sie beantwortet die gestellte Frage nicht. – jason

+0

@Jason: Fair genug. Der Titel der Frage ist "Ist es in Ordnung, von einer Methode in einer Using-Anweisung zurückzukehren?" .. du kannst sehen, ich bin nicht der Einzige, der die Frage so liest. –

+1

@Stan R: Ich sehe das Potenzial für Verwirrung, aber der Beitrag fragt eindeutig nach Best Practices, nicht, ob der finally Block ausgeführt wird oder nicht (d. H. Semantik). – jason

3

Die zweite ist eindeutig besser, und Sie können überprüfen, ob es funktioniert, indem Sie ein Testprogramm schreiben.

Die using Aussage selbst kann keinen Wert haben, der eine Beschränkung ist.Angenommen, Sie haben eine Methode namens Open, die eine offene FileStream zurückgibt, und Sie möchten die Länge der Datei erhalten:

Console.WriteLine(Open().Length); 

Der Fehler ist, dass Sie nicht die FileStream entsorgen. Also muss man (ähnlich wie Ihr Beispiel) schreiben:

long length; 

using (FileStream file = Open()) 
    length = file.Length; 

Console.WriteLine(length); 

Aber mit einem simple extension method, können Sie dies stattdessen schreiben:

Console.WriteLine(Open().Use(file => file.Length)); 

Nizza und ordentlich, und die FileStream ordnungsgemäß entsorgt werden.

+0

Ordentlich, aber unlesbar zur gleichen Zeit :-) –

+0

heh das ist ziemlich ordentlich. Danke für eine kluge Idee. –

+0

@Scott P - es ist im Wesentlichen die gleiche Idee wie die? : 'operator (ein" Ausdruck "entspricht" if "). Manche finden '? : 'weniger lesbar als die äquivalente' if' Aussage, ich finde, dass es manchmal klarer sein kann. Das Entfernen von Variablennamen hilft oft bei der Übersichtlichkeit. –

1

Ich fühle zweit besser

public int Foo() 
{ 
    using(..) 
    { 
    return bar; 
    } 
} 

Eine Sache, die im Auge entsteht, während diese Art und Weise ist, dass wir zurückkehren in zwischen der Verwendung wird so das Objekt (die wir bei der Verwendung eingewickelt haben) erhalten angeordnet , die Antwort ist ja , weil eine using-Anweisung nur die Mischung aus try/finally Block ist, es ist in Ordnung, von einem try-Block auch zurückzukommen. Der Rückgabeausdruck wird ausgewertet, dann wird der finally-Block ausgeführt, und die Methode wird Dann geh. Ahead :)