Wird das schließen einer FileStream schließen Sie die StreamReader?
Wenn ich einen FileStream zu erzeugen StreamReader, wird das StreamReader schließen beim schließen des FileStream-oder muss ich mich in der Nähe der StreamReader auch?
public void ReadFile()
{
var file = new FileStream("c:\file.txt", FileMode.Open, FileAccess.Read);
var reader = new StreamReader(file);
try
{
txtFile.Text = reader.ReadToEnd();
}
catch (Exception)
{
throw;
}
finally
{
file.Close();
}
}
- mögliche Duplikate von Tut Entsorgung streamreader schließen Sie den stream???
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im wesentlichen ja. Sie haben tatsächlich nicht zu schließen, eine StreamReader. Wenn Sie dies tun, alle es tut, ist, schließt den zugrunde liegenden stream.
@Bruno macht einen guten Punkt, um die Schließung der äußeren-die meisten wrapper. Es ist gute Praxis, um in der Nähe der äußeren-die meisten-stream und lassen Sie es in der Nähe liegenden streams um sicherzustellen, dass alle Ressourcen ordnungsgemäß freigegeben.
Vom Reflektor...
Nicht. Sie sollte in der Nähe der
reader
statt. In der Praxis ist das vielleicht kein problem, aber dieStreamReader
hinzufügen könnte einigen Aufwand, müssen möglicherweise gereinigt werden. So sollten Sie immer schließen die meisten top-wrapper.Könnte man auch einfach die Datei verwenden.ReadAllText-Methode:
Müssen Sie nicht schließen Sie die StreamReader-weil Sie nicht besitzen, nicht verwaltete Ressourcen. Schließen des FileStream-ist ausreichend. Schreiben Sie Ihren code mit
using
wie diese:In der Regel, wenn Sie im Zweifel sind, ist es am besten, um sicher zu sein, und Entsorgen Sie alle IDisposable-Objekten, wenn Sie fertig sind mit Ihnen.
Nicht. Das beste, was zu tun ist, schließen Sie Sie in umgekehrter Reihenfolge, dass Sie Sie wieder öffnete.
Scheint es mir, dass der beste Weg, dies zu tun, insgesamt würde die FileStream schließen nur zu sich selbst. Es hat nicht unbedingt Kenntnis haben von etwas, das vorhanden ist in einer Ebene vor sich, so ist es tatsächlich ein Fehler, es zu tun, würde alles, was auf die höheren Ebenen.
Gesagt, dass die Konstrukte höherer Ebene sollte nicht axiomatically davon ausgehen, nichts über die mitgelieferten darunter liegende Schicht als gut, oder wenn Sie tun, Sie tun sollte, also explizit:
1), Wenn es erstellt wurde, aus einer vorhandenen stream, dann die höher-level-Konstrukt in der Lage sein sollten, die geschlossen werden UNABHÄNGIG des zugrunde liegenden Streams (effektiv entsorgen alle Ressourcen zugewiesen, die für den eigenen Gebrauch) oder geschlossen EINSCHLIEßLICH den zugrunde liegenden stream. Diese sollten zwei verschiedene Funktionsaufrufe, z.B. Close() und CloseSelf() (wenn das so umgesetzt zu werden, rückwärts kompatibel mit den existierenden code).
2) Wenn es nicht erstellt wurde, aus einer vorhandenen stream (das ist der Konstruktor mußten, den zugrunde liegenden Fluss), schließen Sie das übergeordnete Konstrukt zwingen sollte, den zugrunde liegenden stream zu schließen, da in diesem Fall die zugrunde liegende stream ist ein impliziter Teil des übergeordneten Konstrukts. In diesem Fall CloseSelf() würde einfach rufen Sie Close().
Scheint es, verschwenderisch zu implementieren diese Klassen die Art und Weise es gemacht wurde. Wenn Sie planen, verwenden Sie die gleiche Datei (als Beispiel) serielle Eingabe und serielle Ausgabe, Sie sind gewissermaßen gezwungen das system zu behandeln, als zwei unterschiedliche Entitäten, wenn Sie möchten, um den Zugang zu der höheren Ebene Funktionen der abgeleiteten Klassen. Ihre alternative ist, um stick auf der unteren Ebene konstruieren und implementieren Sie die higher-level-Funktionalität, selbst - wirksam zu re-implementieren Sie Ihre eigenen speziellen Versionen von abgeleiteten Klassen, die bereits existieren.
Wenn es wurden, wie oben beschrieben, die typische Funktionalität wäre so einfach zu implementieren, wie es jetzt ist, aber für anspruchsvollere Anwendungen, die man erhalten würde, die Fähigkeit eine einzelne Sperre auf eine Datei und re-Zweck es als erforderlich, wenn erforderlich, im Gegensatz zum Verzicht auf das Schloss und alle damit verbundenen Ressourcen und dann sofort neu zuteilen, die Sie alle immer wieder - hinzufügen overhead und die Fragmentierung des Speichers an das system ohne jeden gültigen Grund.
Unter den bestehenden Bedingungen, wenn auch, die richtige Sache ist klar. Den FileStream kann nicht davon ausgegangen werden, nichts wissen zu jedem Objekt wird ein Teil, so müssen Sie schließen Sie das äußerste umschließende Konstrukt. Dies gilt unabhängig davon, ob oder nicht, es funktioniert so oder so, wie Bruno et al festgestellt haben, und für die Grund Gaben Sie - Kompatibilität. Annahme ist der ur-Großvater der hässlichsten bugs.
Eine interessante Nebenbemerkung ist, dass die Schließung einer StreamReader oder Schriftsteller wird sich auf den status Lesen/schreiben der Besitz FileStream. Dies scheint zu bedeuten, dass man nicht mit einem StreamReader und dann einen StreamWriter mit dem gleichen filestream.