2012-08-29 10 views
9

Ambos BinaryReaderconstructors requieren un parámetro de secuencia. Si necesito mantener el flujo subyacente tal como está, cuando haya terminado con el BinaryReader, ¿debo llamar al Dispose()? De lo contrario, ¿hay alguna otra limpieza para la que ya no se necesita BinaryReader?¿Debo disponer de un BinaryReader si necesito preservar el flujo "envuelto"?

Pregunto porque no puedo encontrar una respuesta clara en MSDN page for BinaryReader.Dispose().

Pequeño addtion

En mi contexto utilizo el BinaryReader de leer un par de bytes, después de lo cual me puse la posición de la corriente de volver a lo que era antes de la BinaryReader se ha inicializado.

Además, estoy usando .Net 4.

Respuesta

11

No, está bien para no disponer de la BinaryReader si desea mantener el flujo abierto.

probablemente añadiría un comentario para explicar lo que está pasando, aunque - y no estoy seguro de si se trata de garantiza que el BinaryReader sólo habrá leído de la corriente por lo que usted ha leído desde el BinaryReader. .. podría haber leído más en un búfer, por ejemplo. Obviamente, eso no es un problema si luego buscas en la transmisión.

+0

sí He actualizado mi pregunta para mencionar que solo leí un par de bytes con el 'BinaryReader'. –

12

Si usted (o cualquier otra persona que lea estas buscando una respuesta) está usando VS 2012 con .NET 4.5 (o posterior) puede crear un BinaryReader que no cerrará la secuencia. Ej .:

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

new UTF8Encoding es el valor predeterminado si se ha utilizado el constructor BinaryReader (Stream), si usted no quiere UTF8Encoding, se puede usar otra cosa. El true significa "sí, deja la secuencia abierta".

2

Si fuera yo, me gustaría disponer de la BinaryReader, por el simple hecho de tidyness ... pero también me aseguro de que creé el BinaryReader con este this constructor overload:

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

donde especificando el argumento leaveOpen como true indica al lector que deje la secuencia subyacente abierta.

Al hacer esta ruta, explicita el alcance y la propiedad de las cosas. Menos espacio para la confusión y la incomprensión de esa manera.

+1

Estoy de acuerdo con su comentario al 100%, y probablemente no hubiera hecho la pregunta si estaba usando 4.5 porque probablemente habría notado el argumento 'leaveOpen'. –

3

ya hay una respuesta aceptada, pero me hace sentir sucia :-) Creo que podemos hacer mejor:

  1. Si está utilizando .NET 4.5, se debe utilizar el constructor 3-arg de BinaryReader. Hecho.
  2. Si está utilizando .NET 3.5/4.0, se necesita una solución diferente

Jon Skeet (la respuesta aceptada) sugiere que nunca disponer el BinaryReader. Bueno, eso funciona, por supuesto, pero podría ser una fuente de confusión.

Una solución alternativa podría ser envolver su flujo en un NonClosingStreamWrapper, antes de pasarlo a BinaryReader.El BinaryReader cerrará el contenedor cuando se elimine, pero el NonClosingStreamWrapper no eliminará el flujo subyacente. Todavía puede usar .Disponer en binaryStream (o incluso mejor, el patrón de uso).

Irónicamente, @JonSkeet ya creó un NonClosingStreamWrapper para hacer precisamente eso. Es parte de su miscutil library. (pero tenga en cuenta la licencia)

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