2009-07-03 5 views
9

Mit diesem Code:Haben wir einen C# oder Binarybinary in einem mit Block schließen müssen?

using (BinaryWriter writer = new BinaryWriter(File.Open(ProjectPath, FileMode.Create))) 
{ 
    //save something here 
} 

Müssen wir die Binary schließen? Wenn nicht, warum?

+0

Trotz der Tatsache, dass es eine andere Art ist, dann ist dies ein Duplikat http://stackoverflow.com/questions/1070667/is-is-necessary-to-dispose-dbcommand-after-use/. Ich würde wählen, um zu schließen, aber habe mein Limit für den Tag erreicht. Ich schlage vor, dass wir nicht brauchen, eine „sollte ich eine Klasse verfügen, die IDisposable implementiert“ Frage für jede Klasse, die es implementiert. Bitte erwäge das Voting als Duplikat deiner IDisposable-Frage. –

+0

Wer wirklich denkt, dass dies ein Dokumentations-/API-Designfehler ist: Der Compiler sollte Sie warnen, wenn Sie offensichtliche Fehler machen, und die Dokumentation sollte eindeutig beschriften, welche Close() -Anrufe mit Dispose gleichwertig sind (und vorzugsweise keine haben) solche Close() -Aufrufe, die an erster Stelle völlig redundant sind). –

Antwort

18

Solange alles in einem using Block verpackt ist, müssen Sie nicht explizit Close aufrufen.

using Der Block stellt sicher, dass das Objekt angeordnet ist, und die Close und Dispose Methoden sind austauschbar auf BinaryWriter. (Die Close Methode ruft nur Dispose hinter den Kulissen.)

4

Mit dem Code, den Sie da haben es die Datei schließen, sobald sie die Verwendung von Block verlassen, so müssen Sie nicht in der Nähe explcitly nennen. Der einzige Grund, die using-Anweisung nicht zu verwenden, wäre, wenn Sie möchten, dass die Datei immer noch geöffnet ist, nachdem Sie Ihren BinaryWriter beendet haben. In diesem Fall sollten Sie eine Referenz davon beibehalten, statt sie an die übergebene Datei zu übergeben Konstruktor so.

4

Setzen Sie es in eine using-Anweisung gemäß Ihrem Codebeispiel wird Dispose aufrufen, die den zugrunde liegenden Stream schließt, also nein. Sie können dies durch Reflector sehen:

protected virtual void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     this.OutStream.Close(); 
    } 
} 
0

Die Verwendung von Block automaticlly den binären Schriftsteller schließen und es in einen Zustand versetzt werden GC'ed. Mit Blöcken sind syntaktischer Zucker die Ausnahmebehandlung zu tun und Schließen des Stroms selbst.

0

vom Schreiber oben in einem Block unter Verwendung Umwickeln Ereignisse eintreten schließt sich automatisch, wenn der Schreiber angeordnet ist. In diesem Fall müssen Sie den Writer nicht explizit schließen.