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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top