2013-01-31 25 views
6

Mögliche Duplizieren:
Nested using statements in C#Ist es in Ordnung, `using` so zu verwenden?

Ich bin ein großer Fan der using Anweisung in C#. Das finde ich:

using (var foo = new ObjectWhichMustBeDisposed()) 
{ 
    other code 
} 

... sehr viel besser lesbar als das:

var foo = new ObjectiWhichMustBeDisposed(); 

try 
{ 
    other code 
} 
finally 
{ 
    foo.Dispose(); 
} 

Es ist nicht nur besser lesbar, auch versehentliche Verwendung des foo Variable nach der using Anweisung verhindert (dh nachdem es entsorgt wurde), während im zweiten Beispiel foo nach der Entsorgung verwendet werden konnte.

Ein Problem mit using ist jedoch, dass es dazu neigt, zu sehr verschachtelten Code zu führen, wenn viele Einwegobjekte erstellt werden. Zum Beispiel:

using (var foo = new ObjectWhichMustBeDisposed()) 
{ 
    using (var bar = new ObjectWhichMustBeDisposed()) 
    { 
     other code 
    } 
} 

Wenn beiden Objekte des gleichen Typs sind, dann können Sie sie in eine einzige using Anweisung kombinieren, etwa so:

using (var foo = new ObjectWhichMustBeDisposed(), 
      bar = new ObjectWhichMustBeDisposed()) 
{ 
    other code 
} 

jedoch, wenn die Objekte nicht von dem sind gleicher Typ, dann wird das nicht funktionieren.

Meine Frage ist, ob es in Ordnung ist ein ähnliches Ende wie folgt zu erreichen:

using (var foo = new ObjectWhichMustBeDisposed()) 
using (var bar = new OtherObjectWhichMustBeDisposed()) 
{ 
    other code 
} 

In diesem Fall gibt es keine geschweiften Klammern nach dem ersten Verwendung (und daher keine Notwendigkeit, den Code einrücken). Dies kompiliert, und ich nehme an, dass dies genau wie eine if Anweisung ohne Klammern funktioniert - d. H. Es wird die nächste Anweisung (die zweite using in diesem Fall) als seinen "Körper" verwenden.

Kann jemand bestätigen, ob das richtig ist? (Die description of the using statement ist keine Hilfe).

+0

Es funktioniert sicherlich. Wenn es in Ordnung ist, ist zwischen Ihnen und Ihrem Programmierstil. – CodesInChaos

+0

Ja, es ist völlig korrekt :) –

+0

Es kompiliert gut das einzige, was ich sagen würde ist, dass für die Lesbarkeit und Konsistenz mit einem Stil der Verpackung Code-Blöcke um '{}' – MethodMan

Antwort

2

Blick auf using Anweisungsdefinition in C# Standard:

12.3.3.17 Mit Aussagen
Für eine using-Anweisung Anw der Form:
mit (resource-acquisition) Embedded-Anweisung

Embedded-Anweisung ist was auch immer von den folgenden (Siehe Artikel A2.5):

Embedded-Anweisung:
Block
leer-Anweisung
Ausdruck-Anweisung
Auswahl-Anweisung
Iteration-Anweisung
Sprung-Anweisung
try-Anweisung
checkten Aussage
unchecked-statement
Lock-Anweisung
using-Anweisung
Ertragsrechnung

So beide Verwendungen von using (Block oder eine andere Verwendung-Anweisung) sind absolut gleichwertig von C# Standard Sicht.

+0

Danke an alle, die geantwortet haben, und Entschuldigung, ich kann Sie nicht alle akzeptieren, aber ich dachte es besser diese Antwort zu akzeptieren - was definitiv ist/belegt. –

7

Ja der Code, den Sie vorschlagen

using (var foo = new ObjectWhichMustBeDisposed()) 
using (var bar = new OtherObjectWhichMustBeDisposed()) 
{ 
    other code 
} 

beide OK und durchaus üblich ist.

Sie brauchen nicht zusätzlich zu verwenden {} nach jeder mit (andere als die, die anderen Code enthält, wenn anderen Code mehr als eine Anweisung ist), weil jeder mit genau eine Aussage es folgende .

using (var foo = new ObjectWhichMustBeDisposed()) 
using (var bar = new OtherObjectWhichMustBeDisposed()) 
using (var baz = new OtherObjectWhichMustBeDisposed()) 
using (var quux = new OtherObjectWhichMustBeDisposed()) 
{ 
    other code 
} 

wäre auch in Ordnung.

+1

Dies gilt auch für jede strukturierte Anweisung wie 'if',' while' und so weiter. –

+0

@ OlivierJacot-Descombes Außer "Versuch"/"Fang".[Hier ist warum] (http://ericlippert.com/2012/12/04/why-are-braces-required/) – Servy

1

Ja, das ist richtig.

using (var foo = new ObjectWhichMustBeDisposed()) 
using (var bar = new OtherObjectWhichMustBeDisposed()) 
{ 
    other code 
} 

Der Rest liegt also bei Ihnen. Wenn Sie diese Kodierung mögen, gehen Sie mit.

Verwandte Themen