2012-08-29 3 views
9

Beide BinaryReaderconstructors erfordern einen Stream-Parameter. Wenn ich den zugrunde liegenden Stream behalten muss, wenn ich mit der BinaryReader fertig bin, sollte ich noch seine Dispose() anrufen? Wenn nicht, gibt es eine andere Reinigung für die nicht mehr benötigte BinaryReader?Soll ich einen BinaryReader deployen, wenn ich den "verpackten" Stream beibehalten muss?

Ich frage, weil ich keine klare Antwort auf MSDN page for BinaryReader.Dispose() finden kann.

Klein addtion

In meinem Kontext verwende ich die BinaryReader ein paar Bytes zu lesen, nach dem ich die Position des Stroms zurück zu dem, was es war, bevor die BinaryReader initialisiert wurde.

Auch ich bin mit .Net 4.

Antwort

11

Nein, ist es in Ordnung nicht der BinaryReader zu entsorgen, wenn Sie den Strom offen halten wollen.

Ich würde wahrscheinlich einen Kommentar hinzufügen zu erklären, was allerdings vor sich geht - und ich bin nicht sicher, ob es , der wird die BinaryReader nur so weit aus dem Stream gelesen haben garantiert ist, wie Sie aus dem BinaryReader gelesen habe. .. es könnte zum Beispiel mehr in einen Puffer gelesen haben. Offensichtlich ist das kein Problem, wenn Sie dann im Stream suchen.

+0

ja ich habe meine Frage aktualisiert um zu erwähnen, dass ich nur ein paar Bytes mit dem 'BinaryReader' gelesen habe. –

12

Wenn Sie (oder jemand, der diese auf der Suche nach einer Antwort liest) VS 2012 mit .NET 4.5 (oder höher) verwenden, können Sie eine BinaryReader erstellen, die den Stream nicht schließt. Z.B .:

using(var reader = new BinaryReader(theStream, new UTF8Encoding(), true) 
{ 
//... 
} 

new UTF8Encoding ist der Standard, wenn Sie die Binary (Stream) Konstruktor verwendet, wenn Sie UTF8Encoding nicht möchten, können Sie etwas anderes verwenden können. Die true bedeutet "ja, lass den Stream offen".

2

Wenn es nach mir, würde ich von der Binary verfügen, nur um von tidyness ... aber ich würde auch dafür sorgen, dass ich die BinaryReader mit diesem this constructor overload erstellt:

public BinaryReader(
    Stream input, 
    Encoding encoding, 
    bool  leaveOpen 
) 

wo Angabe Das Argument leaveOpen als true weist den Leser an, den zugrunde liegenden Stream offen zu lassen.

Mit dieser Route machen Sie den Umfang und das Eigentum der Dinge deutlich. Weniger Raum für Verwirrung und Missverständnisse.

+1

Ich stimme deinem Kommentar zu 100% zu, und ich hätte die Frage wahrscheinlich nicht gestellt, wenn ich 4.5 verwende, weil ich wahrscheinlich das 'leaveOpen'-Argument bemerkt hätte. –

3

Es gibt bereits eine akzeptierte Antwort, aber es macht mich schmutzig fühlen :-) Ich denke, wir können es besser machen:

  1. Wenn Sie .NET 4.5 verwenden, sollten Sie die 3-arg Konstruktor von BinärReader. Erledigt.
  2. Wenn Sie .NET 3.5/4.0, verwenden, müssen Sie eine andere Lösung

Jon Skeet (die akzeptierte Antwort) schlägt vor, nur noch nie das Binary zu entsorgen. Nun, das funktioniert natürlich, könnte aber eine Quelle der Verwirrung sein.

Eine alternative Lösung könnte sein, Ihren Stream in einen NonClosingStreamWrapper zu verpacken, bevor Sie diesen an BinaryReader übergeben.Der BinaryReader schließt den Wrapper, wenn er entsorgt wird, aber der NonClosingStreamWrapper wird den zugrunde liegenden Stream nicht löschen. Sie können immer noch .Dispose auf dem binaryStream verwenden (oder noch besser, dem using-Muster).

Sehr ironisch, @JonSkeet hat bereits einen NonClosingStreamWrapper erstellt, um genau das zu tun. Es ist Teil seiner miscutil library. (aber notieren Sie sich die Lizenz)

using(var reader = new BinaryReader(new NonClosingStreamWrapper(myStream))) 
{ 
//... 
} 
Verwandte Themen