Tengo una clase que esencialmente envuelve un flujo para leer/escribir, pero se espera que ese flujo sea administrado por el consumidor de esa clase. Para facilitar el uso, uso las clases StreamReader y StreamWriter para realizar operaciones de E/S en la transmisión. Normalmente envolvería el lector y el escritor en los bloques using
, pero quiero evitar cerrar el lector y el escritor porque al hacerlo también se cierra el flujo subyacente y tengo que mantenerlo abierto.¿Está bien no cerrar StreamReader/StreamWriter para mantener abierta la secuencia subyacente?
¿Es seguro en términos de gestión de memoria/recursos no cerrar un StreamReader/StreamWriter si espero que el emisor gestione el Stream subyacente? ¿Serán el lector y el escritor recolectados basura cuando la transmisión se cierre explícitamente en otro lugar?
public class Wrapper
{
private Stream _underlyingStream;
public Wrapper(Stream underlyingStream)
{
_underlyingStream = underlyingStream;
}
public string GetValue()
{
_underlyingStream.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(_underlyingStream);
return reader.ReadToEnd(); // we're done, but the stream is not ours to close
}
}
Esta pregunta podría ayudar: http://stackoverflow.com/questions/1862261/can-you-keep-a-streamreader-from-disposing-the-underlying-stream –
No relacionado con la pregunta, pero dado que el contenedor no es "propietario" de la transmisión, es posible que también desee guardar la original '_underlyingStream.Position' y restaurarlo a esa posición después de ReadToEnd() antes de regresar a la persona que llama. (Aunque, su uso puede ser tal que la persona que llama espera que la posición se vea afectada por dicha llamada, y puede guardar la posición por sí mismo si es importante). –