Etwas wie:
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Ich glaube, es ist kein geeigneter Ort für eine Rückgabeerklärung, oder?
Etwas wie:
using (IDisposable disposable = GetSomeDisposable())
{
//.....
//......
return Stg();
}
Ich glaube, es ist kein geeigneter Ort für eine Rückgabeerklärung, oder?
Wie mehrere andere allgemein betont haben, ist dies kein Problem.
Der einzige Fall, der Probleme verursacht, ist, wenn Sie in der Mitte einer using-Anweisung und zusätzlich die Variable in using zurückgeben. Andererseits würde dies auch zu Problemen führen, selbst wenn Sie nicht zurückkehren und einfach einen Verweis auf eine Variable behalten.
using ( var x = new Something() ) {
// not a good idea
return x;
}
Genauso schlimm
Something y;
using ( var x = new Something() ) {
y = x;
}
return
, dass die Anweisung das Ende desusing
Blocks für Codepfade unzugänglich macht . Das Ende desusing
Blocks muss ausgeführt werden, damit das Objekt bei Bedarf entsorgt werden kann.Es ist vollkommen in Ordnung.
Sie denken das anscheinend
wird blind übersetzt in:
Was zugegebenermaßen ein Problem wäre und die
using
Aussage ziemlich sinnlos machen würde - weshalb dies nicht der Fall ist.Der Compiler stellt sicher, dass das Objekt entsorgt wird, bevor die Steuerung den Block verlässt - unabhängig davon, wie sie den Block verlässt.
quelle
Es ist absolut in Ordnung - überhaupt kein Problem. Warum glaubst du, ist es falsch?
Eine using-Anweisung ist nur syntaktischer Zucker für einen try / finally-Block, und wie Grzenio sagt, ist es in Ordnung, auch von einem try-Block zurückzukehren.
Der Rückgabeausdruck wird ausgewertet, dann wird der finally-Block ausgeführt, und die Methode wird zurückgegeben.
quelle
Dies wird einwandfrei funktionieren, genauso wie die Rückkehr in die Mitte von
try{}finally{}
quelle
Das ist völlig akzeptabel. Eine using- Anweisung stellt sicher, dass das IDisposable-Objekt unabhängig davon entsorgt wird.
Von MSDN :
quelle
Der folgende Code zeigt, wie
using
es funktioniert:Ausgabe:
Die disposed werden nach der return-Anweisung, jedoch vor dem Beenden der Funktion aufgerufen.
quelle
Vielleicht ist es nicht 100% wahr, dass dies akzeptabel ist ...
Wenn Sie zufällig Benutzer verschachteln und aus einem verschachtelten zurückkehren, ist dies möglicherweise nicht sicher.
Nehmen Sie dies als Beispiel:
Ich habe eine DataTable übergeben, die als CSV ausgegeben werden soll. Mit der Rückgabe in der Mitte wurden alle Zeilen in den Stream geschrieben, aber der ausgegebenen CSV fehlte immer eine Zeile (oder mehrere, abhängig von der Größe des Puffers). Dies sagte mir, dass etwas nicht richtig geschlossen wurde.
Der richtige Weg ist, sicherzustellen, dass alle vorherigen Verwendungen ordnungsgemäß entsorgt werden:
quelle