2012-12-27 2 views
7

Wenn Sie Close auf einem aktiven StreamWriter aufrufen, ist es unmöglich, weiteren Code in den Stream zu schreiben (da er geschlossen wurde). Um einen anderen Stream zu öffnen, müssen Sie eine neue Instanz von StreamWriter anlegen, da es keine 'Open'-Methode gibt.Was ist der Sinn von Streamwritern mit Close() und Dispose()?

Meine Frage ist, was ist der Punkt in Close und Dispose, wenn Sie wirklich nichts außer Dispose nach dem Schließen des Streams verwenden können?

Ich könnte verstehen, wenn es eine Open Funktion, d. H. Sie könnten eine Datei schließen und dann öffnen Sie eine andere mit der gleichen StreamWriter. Aber da es nur Close gibt und Sie danach nichts wirklich außer Dispose verwenden können, warum nicht einfach Close loswerden und Dispose den zugrunde liegenden Stream als seine erste Aktion schließen?

Ich bekomme, dass Dispose kommt von IDisposeable und all das. Was ich wissen will, ist, warum Close speziell dann benötigt wird, wenn Dispose scheint Close auf jeden Fall aufrufen.

Soweit ich sehen kann, ohne die Möglichkeit, einen anderen Strom mit der gleichen StreamWriter zu öffnen, gibt es keinen Punkt Close in mit, wenn Sie keine andere Wahl, als zu Dispose danach, da alle anderen Methoden unbrauchbar werden.

Warum ist, dass StreamWriter bothers Close hat, wenn sie Close und Dispose in ein einziges Verfahren zusammenführen könnten?

+1

Es sieht aus wie Sie es nach hinten haben - 'Close' ruft' Dispose', nicht umgekehrt. –

+1

'Close' ruft' Dispose' auf, wodurch die zugrunde liegende Stream-Ressource geschlossen wird. –

Antwort

2

Beim Umgang mit Streams gibt es eine lange Konvention, die Close ist eine Methode, die sie den Stream schließen müssen. Es ist eine Terminologie, die viele Programmierer gewohnt sind und erwarten, wenn sie mit Streams umgehen. Es wäre möglicherweise verwirrend gewesen, einen Stream ohne eine Close-Methode zu haben, und es könnte einige Zeit dauern, bis die Leute bemerkt haben, dass sie Dispose verwenden sollten, um den Stream zu schließen.

Es ist sicherlich möglich für die Klasse IDisposable ausdrücklich umgesetzt haben, so dass die Dispose Verfahren nicht dort ohne gegossene zu IDisposable sein würde und dass meine haben einige der Verwirrung aufgeräumt, aber sie nicht zu wählen tun Sie das und zwei doppelte Methoden in der Klasse zu belassen.

Es ist ganz nach Ihren persönlichen Vorlieben, ob Sie Dispose oder Close verwenden, um den Stream zu schließen.

+1

Ich habe das oft gelesen, dass close ist Teil von Streams und Reader/Writers einfach wegen der Konvention, eine Datei "zu schließen". Ich kann mich nicht erinnern, aber ich habe das Gefühl, dass diese Information in CLR über C# beschrieben wurde. –

+2

'Close' ist wirklich nur ein Rest von .NET 1.0, bevor die Conventions heruntergefallen sind.Microsoft hat seither gesagt, dass "Dispose" wegen der Konsistenz zwischen verschiedenen APIs bevorzugt werden sollte, und hat seither keine Feature-Duplizierende "Close" -Methode geschrieben. –

+0

Zurückgehen über einige meiner letzten Fragen, die keine Antwort hatten. Ich habe das hier ausgewählt, weil alle anderen Antworten mein Problem zu lösen schienen, ob "Close" "Dispose" nennt oder andersherum als meine eigentliche Frage "Warum StreamWriter so nah dran ist, wenn sie könnten Merge Schließen und Dispose in einer einzigen Methode? ". Ich weiß nicht genau, ob das die * richtige Antwort ist, aber es ist sicherlich die * richtigste * Antwort. – Pharap

1

Gemäß the documentation ruft Close nur Dispose mit einem Wert von true.

  • Diese Methode überschreibt Schließen.

  • Diese Implementierung von Close ruft die Dispose-Methode auf, die einen wahren Wert übergibt.

  • Sie müssen Close aufrufen, um sicherzustellen, dass alle Daten korrekt in den zugrunde liegenden Stream geschrieben werden. Nach einem Aufruf von Close können alle Vorgänge im StreamWriter möglicherweise auslösen. Wenn auf der Festplatte nicht genügend Speicherplatz vorhanden ist, löst das Aufrufen von Close eine Ausnahme aus.

Dispose selbst wird von IDisposable, geerbt, die von Klassen verwendet wird, die Ressourcen, die freigegeben werden müssen.

0

Beim Öffnen eines Streams werden sowohl Anwendungs- als auch Systemressourcen zugewiesen. Wenn Ihre Anwendung viele Streams öffnet, ohne sie zu schließen, beschränkt dies die Möglichkeit anderer Anwendungen, auf diese Dateien zuzugreifen. Es ist wichtig, dass Streams so schnell wie möglich geschlossen werden.

Soweit, warum Streams nicht die Fähigkeit haben, wieder zu öffnen, ist dies im Grunde der .NET-Ansatz. Die Klasse repräsentiert einen offenen Stream. Erstelle also einen, um auf den Stream zuzugreifen und ihn so schnell wie möglich loszuwerden. Wenn Sie erneut auf den Stream zugreifen möchten, erstellen Sie einen anderen.

Ich denke, es wäre gültig, eine Stream-Klasse zu erstellen, die wieder geöffnet werden konnte, aber es verursacht einige Probleme, da viele der Methoden nicht funktionieren würden, wenn der Stream geschlossen wurde. Am Ende stellt eine Stream-Klasse wirklich einen offenen Stream dar.

Dispose ist nur dazu da, um sicherzustellen, dass der Stream rechtzeitig gereinigt wird.

-1

Sie sind auf dem richtigen Weg, wenn Sie sagen "warum nicht einfach loswerden ..." außer es ist rückwärts. Wenn Sie StreamWriter.Close() am zugrunde liegenden Code anschauen, werden Sie sehen:

public override void Close() 
{ 
    this.Dispose(true); 
    GC.SuppressFinalize((object) this); 
} 

So ist die Close() -Methode nur die Art und Weise würden Sie den Rahmen sagen, dass Sie fertig sind, um den Strom zu schreiben.

0

warum nicht einfach schließen und schließen Sie haben den zugrunde liegenden Stream als seine erste Aktion zu schließen?

Es ist gute Programmierpraxis.

Angenommen, Sie haben Lichter in Ihrem Haus, die sich beim Verlassen automatisch ausschalten. Sie würden nicht haben, um die Lichter auszuschalten, wenn Sie gingen, aber es ist gut Praxis. Auf diese Weise würden Sie nicht verlangen, dass jedes Haus, in dem Sie wohnen, automatisch das Licht ausschaltet. Sie würden die Angewohnheit haben, sie selbst auszuschalten.

Explizit aufrufen Close() sagt dem Leser (und dem System) "Ich bin mit diesem Strom fertig", und Aufruf Dispose() sagt dem System (und dem Leser) "Sie können alle eingebetteten Ressourcen freigeben".

+2

Sie müssen beide Methoden nicht aufrufen. 'Close' ruft nur' Dispose' auf. Beide zu nennen ist einfach überflüssig und keineswegs eine gute Übung. – Servy