2012-08-29 6 views
9

Entrambi BinaryReaderconstructors richiedono un parametro di flusso. Se devo mantenere lo stream sottostante così com'è quando ho finito con lo BinaryReader, dovrei comunque chiamare il suo Dispose()? In caso contrario, ci sono altri interventi di pulizia per il non più necessario BinaryReader?Devo gettare un BinaryReader se devo conservare lo stream "wrapped"?

Sto chiedendo perché non riesco a trovare una risposta chiara su MSDN page for BinaryReader.Dispose().

Piccolo addtion

Nel mio contesto uso la BinaryReader di leggere un paio di byte, dopo di che ho impostato la posizione del flusso di nuovo a quello che era prima della BinaryReader è stata inizializzata.

Inoltre, sto usando Net 4.

risposta

11

No, va bene di non smaltire la BinaryReader se si desidera mantenere il flusso aperto.

probabilmente mi piacerebbe aggiungere un commento per spiegare cosa sta succedendo anche se - e non sono sicuro che si tratti di garantito che il BinaryReader avranno letto solo dal flusso di quanto avete letto dal BinaryReader. .. potrebbe aver letto di più in un buffer, per esempio. Ovviamente non è un problema se poi cerchi il flusso.

+0

sì, ho aggiornato la mia domanda per citare ho letto solo un paio di byte con 'BinaryReader'. –

12

Se tu (o chiunque altro stia leggendo questi cercando una risposta) stai usando VS 2012 con .NET 4.5 (o successivo) puoi creare un BinaryReader che non chiuderà il flusso. Es .:

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

new UTF8Encoding è il default se si è utilizzato il costruttore BinaryReader (Stream), se non si vuole UTF8Encoding, è possibile utilizzare qualcos'altro. Il true significa "sì, lascia aperto il flusso".

2

Se mi fosse, mi piacerebbe disporre del BinaryReader, solo per il gusto di tidyness ... ma mi piacerebbe anche assicurare che ho creato il BinaryReader con questo this constructor overload:

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

dove specificando l'argomento leaveOpen come true indica al lettore di lasciare aperto il flusso sottostante.

Passando a questo percorso, si rendono espliciti l'ambito e la proprietà delle cose. Meno spazio per la confusione e l'incomprensione in questo modo.

+1

Sono d'accordo con il tuo commento 100%, e probabilmente non avrei chiesto se stavo usando 4.5 perché avrei probabilmente notato l'argomento 'leaveOpen'. –

3

C'è già un risposta accettata, ma mi fa sentire sporca :-) Penso che possiamo fare meglio:

  1. Se stai usando .NET 4.5, è necessario utilizzare il costruttore 3-arg di BinaryReader. Fatto.
  2. Se si sta utilizzando .NET 3.5/4.0, è necessaria una soluzione diversa

Jon Skeet (la risposta accettata) suggerisce di non solo smaltire l'BinaryReader. Bene, questo funziona naturalmente, ma potrebbe essere fonte di confusione.

Una soluzione alternativa potrebbe essere quella di avvolgere il flusso in un NonClosingStreamWrapper, prima di passarlo a BinaryReader.BinaryReader chiuderà il wrapper quando viene eliminato, ma il NonClosingStreamWrapper non disporrà il tuo Stream sottostante. Puoi ancora usare .Dispose su binaryStream (o ancora meglio, il pattern di utilizzo).

Molto ironicamente, @JonSkeet ha già creato un NonClosingStreamWrapper per fare proprio questo. Fa parte del suo miscutil library. (ma nota la licenza)

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