2009-06-23 4 views

Antwort

26

Die erste ist besser. Es stellt sicher, dass es auch dann verworfen wird, wenn eine Ausnahme ausgelöst wird, und verarbeitet den Fall, in dem Create(0) null zurückgibt (d. H. Es wird nicht versucht, Dispose() für eine Nullinstanz aufzurufen).

+0

Vielen Dank! Das war genau die Art von Antwort, nach der ich suchte. – mkelley33

+11

Ein weiterer kleiner Punkt, den niemand erwähnt hat, ist, dass die Verwendung von "using" verhindert, dass Sie versehentlich den Inhalt der Variablen "ctx" nach der Initialisierung, aber vor der Entsorgung verändern. Sie möchten nicht versehentlich ein anderes als das von Ihnen erstellte Objekt entsorgen. –

2

Die using-Anweisung gibt Ihnen nette Syntax plus Ausnahme-Schutz. Sie können die using-Anweisung nicht verlassen, ohne Dispose aufzurufen (dies wird in einen finally-Block mit einem Aufruf zur Verfügung gestellt). Wenn Sie in Ihrem zweiten Szenario eine Ausnahme zwischen Create und Dispose hätten, würden Sie dispose nicht direkt aufrufen. Das ist kein Problem, wenn Sie nicht verwaltete Ressourcen verwenden, aber wenn Sie es sind, werden Sie undicht.

3

Wo Sie können, verwenden Sie using für die Gründe, die Marc zitiert. OTOH das ist keine hirntote Lösung, da manchmal die Lebensdauer des Objekts nicht als lexikalischer Bereich definiert werden kann, also benutze es vernünftig.

3

Die einzige Stelle, an der Sie einen using-Block nicht verwenden möchten, ist, wenn das verfügbare Objekt außerhalb der Funktion liegt. In diesem Fall sollte Ihre Klasse IDisposable implementieren und über das Objekt in seiner Dispose() verfügen.

+0

Ich bin auf Fälle gestoßen, in denen die Lebensdauer des Objekts kürzer ist als die Lebensdauer des Besitzers. – BCS

7

Eine using Aussage ist immer besser, weil ...

  • Sie nicht Dispose() nennen vergessen kann, auch wenn der Code verschiedene Codepfade
  • entwickelt sich zu Dispose() aufgerufen wird, auch wenn es eine Ausnahme ist. Es prüft auch auf null vor dem Aufruf Dispose(), was nützlich sein kann (vorausgesetzt, Sie rufen nicht nur new).

Ein nicht offensichtlich (für mich jedenfalls) Trick mit using ist, wie Sie übermäßige Verschachtelung vermeiden können, wenn Sie mehrere Einweg-Objekte haben:

using (var input = new InputFile(inputName)) 
using (var output = new OutputFile(outputName)) 
{ 
    input.copyTo(output); 
} 

Der Formatierer VS Code wird die beiden Aussagen verlassen Start in der gleichen Spalte.


In der Tat, in einigen Situationen Sie nicht einmal die Anweisung using wiederholen müssen ...

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2)) 

die Beschränkungen für die Deklaration von mehreren Variablen auf der gleichen Linie hier gilt jedoch, so dass die Typen müssen identisch sein und Sie können den impliziten Typ var nicht verwenden.