Hat das Anordnen der Strom Stream schließen?
-
21-08-2019 - |
Frage
Ich bin einen Strom an Methoden Senden an zu schreiben, und in jenen Methoden, die ich einen binären Leser / wrtier verwenden. Wenn der Leser / Schreiber wird angeordnet, entweder durch using
oder nur, wenn es nicht Bezug genommen wird, ist der Strom als auch ?? geschlossen
Ich möchte einen Binary / Writer senden, aber ich bin mit einem Stream auch (vielleicht sollte ich das umgehen. Ich bin nur mit, dass für GetLine und Readline). Das ist ziemlich lästig, wenn er den Strom jedes Mal, wenn ein Schriftsteller schließt / Leser geschlossen wird.
Lösung
Ja, StreamReader
, StreamWriter
, BinaryReader
und BinaryWriter
alle in der Nähe / entsorgen ihre zugrunde liegenden Ströme, wenn Sie Dispose
auf sie nennen. Sie nicht des Stroms entsorgen, wenn der Leser / Schreiber ist nur Müll obwohl gesammelt - Sie sollten immer entsorgen Sie das Lese- / Schreibgerät, vorzugsweise mit einer using
Aussage. (In der Tat, keine dieser Klassen hat Finalizers, noch sollten sie haben.)
Persönlich ziehe ich es für den Strom als auch eine using-Anweisung haben. Sie können Nest using
Anweisungen ohne Klammern ganz ordentlich:
using (Stream stream = ...)
using (StreamReader reader = new StreamReader(stream, Encoding.Whatever))
{
}
Auch wenn die using
Anweisung für den Strom etwas redundant ist (es sei denn, der StreamReader
Konstruktor eine Ausnahme auslöst) halte ich es für beste Praxis als dann, wenn Sie von der StreamReader
loszuwerden und nur den Strom verwenden, um direkt zu einem späteren Zeitpunkt, Sie‘ ll bereits die richtige Entsorgung Semantik hat.
Andere Tipps
Dies ist eine alte, aber ich wollte etwas Ähnliches tun heute und fand, dass die Dinge geändert haben. Da .net 4.5, gibt es ein leaveOpen
Argument:
public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen )
Das einzige Problem ist, dass es nicht ganz klar ist, was für die anderen Parameter einzustellen. Hier ist etwas Hilfe:
die Msdn für Stream Konstruktor (Stream):
Dieser Konstruktor initialisiert die Codierung UTF8Encoding, die Base Eigenschaft der Stream-Parameter verwenden, und die interne Puffergröße auf 1024 Bytes.
Das gerade verlässt detectEncodingFromByteOrderMarks
, die von der Quellcode ist true
public StreamReader(Stream stream)
: this(stream, true) {
}
public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks)
: this(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks, DefaultBufferSize) {
}
Es wäre schön, wenn einige dieser Ausfälle ausgesetzt waren oder wenn die Argumente optional waren, so dass wir konnten nur diejenigen an, die wir wollen.
Ja, es tut. Sie können dies überprüfen, indem bei der Umsetzung mit Reflektor suchen.
protected override void Dispose(bool disposing)
{
try
{
if ((this.Closable && disposing) && (this.stream != null))
{
this.stream.Close();
}
}
finally
{
if (this.Closable && (this.stream != null))
{
this.stream = null;
this.encoding = null;
this.decoder = null;
this.byteBuffer = null;
this.charBuffer = null;
this.charPos = 0;
this.charLen = 0;
base.Dispose(disposing);
}
}
}
Sechs Jahre zu spät, aber vielleicht könnte dies jemand helfen.
Stream funktioniert die Verbindung schließen, wenn es angebracht ist. Jedoch „verwendet (Stream stream = ...) {...}“ mit Stream / Streamwriter im Strom führen kann, der doppelt angeordnet ist: (1) wenn das Streamobjekt angeordnet ist (2) und wenn der Strom unter Verwendung von Block schließt. Dies führt zu einer CA2202 Warnung, wenn VS des Code-Analyse ausgeführt wird.
Eine andere Lösung, direkt aus dem CA2202 Seite genommen, einen Versuch verwenden / schließlich blockieren. Setup richtig, wird dies nur die Verbindung einmal schließen.
In der Nähe der Unterseite des CA2202 , empfiehlt Microsoft zu verwenden, die folgende:
Stream stream = null;
try
{
stream = new FileStream("file.txt", FileMode.OpenOrCreate);
using (StreamWriter writer = new StreamWriter(stream))
{
stream = null;
// Use the writer object...
}
}
finally
{
if(stream != null)
stream.Dispose();
}
statt ...
// Generates a CA2202 warning
using (Stream stream = new FileStream("file.txt", FileMode.Open))
using (XmlReader reader = new XmlReader (stream))
{
// Use the reader object...
}
Ja. Aufruf von Dispose () auf und IDisposable (das bedeutet „mit“) sollte ein Objekt aufzuräumen alle seine Ressourcen machen. Dazu gehören Ströme Spülen und ihre Dateideskriptoren schließen.
Wenn in Ihrem Fall, Sie wollen es passieren in anderen Verfahren, dann müssen Sie sicherstellen, dass diese Methoden nicht tun, ihre Lese- / Schreib in einem mit Block.
Eine einfache Möglichkeit, dies zu beheben, wenn Sie müssen, um die Stream Klassen Entsorgen Methode außer Kraft zu setzen. Siehe meinen Beitrag hier für den Code auf, wie es geht:
Hat .Disposing einen Stream den zugrunde liegenden Stream schließen ?
der Strom angeordnet, entweder durch „mit“ Schlüsselwort oder expliziten Aufruf verfügen