2012-08-29 12 views
9

Zarówno BinaryReaderconstructors wymagają parametru strumienia. Jeśli muszę zachować strumień bazowy tak jak jest, gdy kończę pracę z BinaryReader, czy powinienem nadal wywoływać jego numer Dispose()? Jeśli nie, czy jest jakieś inne oczyszczanie dla niepotrzebnego BinaryReader?Czy powinienem zrzucić BinaryReader, jeśli chcę zachować "zawinięty" strumień?

Pytam, ponieważ nie mogę znaleźć jasnej odpowiedzi na temat MSDN page for BinaryReader.Dispose().

Mały addtion

W moim kontekście używam BinaryReader czytać kilka bajtów, po czym ustawić pozycję strumienia z powrotem do tego, co było przed BinaryReader został zainicjowany.

Również używam .NET 4.

Odpowiedz

11

Nie, to dobrze, aby nie wyrzucać BinaryReader jeśli chcesz zachować strumień otwarte.

pewnie bym dodać komentarz, aby wyjaśnić, co się dzieje, choć - i nie jestem pewien, czy to gwarantowana że BinaryReader będą miały tylko do odczytu ze strumienia miarę czytałeś od BinaryReader. .. może na przykład przeczytać więcej w buforze. Oczywiście, to nie jest problem, jeśli szukasz w strumieniu.

+0

Tak, zaktualizowałem moje pytanie, aby wspomnieć, że czytałem tylko kilka bajtów z 'BinaryReader'. –

12

Jeśli ty (lub ktokolwiek czytający te szukające odpowiedzi) używa VS 2012 z .NET 4.5 (lub nowszym), możesz utworzyć BinaryReader, który nie zamknie strumienia. Np .:

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

new UTF8Encoding jest domyślnym jeśli użyto BinaryReader (Stream) Konstruktor, jeśli nie chcesz UTF8Encoding, można użyć czegoś innego. true oznacza "tak, pozostaw otwarty strumień".

2

Jeśli to było do mnie, będę wyrzucać BinaryReader, właśnie przez wzgląd na tidyness ... ale ja też upewnić się, że stworzyłem BinaryReader z tym this constructor overload:

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

gdzie określając Argument leaveOpen jako true nakazuje czytelnikowi pozostawić otwarty strumień.

Idąc tą trasą, wyraźnie określasz zakres i własność rzeczy. Mniej miejsca na zamieszanie i nieporozumienie w ten sposób.

+1

Zgadzam się z Twoim komentarzem w 100% i prawdopodobnie nie zadałbym pytania, czy używałem 4.5, ponieważ prawdopodobnie zauważyłbym argument "leaveOpen". –

3

Istnieje już zaakceptowane odpowiedź, ale to sprawia, że ​​czuję się brudny :-) Myślę, że możemy zrobić lepiej:

  1. Jeśli używasz .NET 4.5, należy użyć 3-Arg konstruktora z BinaryReader. Gotowe.
  2. Jeśli używasz .NET 3.5/4.0, trzeba mieć inne rozwiązanie

Jon Skeet (przyjętą odpowiedź) sugeruje, aby po prostu nie wyrzucać BinaryReader. Cóż, to działa oczywiście, ale może być źródłem nieporozumień.

Alternatywnym rozwiązaniem może być owinięcie strumienia w obiekt NonClosingStreamWrapper, przed przekazaniem go do BinaryReader.BinaryReader zamknie opakowanie po jego usunięciu, ale NonClosingStreamWrapper nie wyrzuci Twojego bazowego strumienia. Nadal można użyć .Dispose na binaryStream (lub jeszcze lepiej, wzorzec użycia).

Bardzo ironicznie, @JonSkeet stworzył już NonClosingStreamWrapper, aby to zrobić. Jest częścią jego miscutil library. (ale zanotuj licencję)

using(var reader = new BinaryReader(new NonClosingStreamWrapper(myStream))) 
{ 
//... 
} 
Powiązane problemy