2011-10-10 5 views

Respuesta

42

Tan pronto como abandone el alcance del bloque de uso, la secuencia se cerrará y desechará. The Close() llama a Flush(), por lo que no debería necesitar llamarlo manualmente.

+0

fin de utilizar por los pelos? Solo sé que descarta la transmisión, y al final siempre lo llamo metodo cerrado. –

+9

Eso no es necesario, Eliminar siempre cerrará la transmisión y Cerrar arrojará primero la corriente. – nos

+1

@FelixCzylwik: si el final del uso no era llamar a Close, tendrías toneladas de streams abiertos y abrir SQLConnections por ahí ...: D –

0

Varía, Stream de forma predeterminada no llama a Flush() en el método Dispose con algunas excepciones como FileStream. La razón de esto es que algunos objetos de transmisión no necesitan la llamada al Flush ya que no usan un búfer. Algunos, como MemoryStream, anulan explícitamente el método para garantizar que no se realice ninguna acción (por lo que no es operativo).
Esto significa que si prefiere no tener la llamada adicional allí, entonces debe verificar si la subclase Stream que está implementa implementa la llamada en el método Dispose y si es necesario o no.

Independientemente, puede ser una buena idea para llamar a que de todos modos sólo para facilitar la lectura - similar a la forma en que algunas personas llaman Close() al final de sus declaraciones utilizando:

using (FileStream fS = new FileStream(params)) 
using (CryptoStream cS = new CryptoStream(params)) 
using (BinaryWriter bW = new BinaryWriter(params)) 
{ 
    doStuff(); 
    //from here it's just readability/assurance that things are properly flushed. 
    bW.Flush(); 
    bW.Close(); 
    cS.Flush(); 
    cS.Close(); 
    fS.Flush(); 
    fS.Close(); 
} 
+1

Argumentaría que agregar las llamadas de color y cerrar activamente perjudica la legibilidad y el mantenimiento. La declaración de uso es lo que proporciona la seguridad de que el objeto se elimina de forma adecuada, incluso en caso de que se produzca una excepción. – Palec

+0

@Palec Entiendo esa posición, este es un estándar de división entre muchos desarrolladores por lo que he visto. – TheHitchenator

+0

@Palec Además, como se indica en mi respuesta, las transmisiones de forma predeterminada no llaman a 'Flush()' en sus métodos de eliminación, lo que significa que si está utilizando una transmisión no estándar creada por alguien que no ha considerado eso, entonces la using statement no vaciará el buffer de forma adecuada. Debido a esto, diría que es una buena práctica enjuagar manualmente: no hará nada si no es necesario, pero si es así, garantizará que los almacenamientos intermedios se desechen correctamente. – TheHitchenator

Cuestiones relacionadas