2010-03-01 11 views
15

Siempre es necesario cerrar flujos o, dado que .net es código administrado, se cerrará automáticamente tan pronto como se salga del alcance (suponiendo que no haya excepciones).¿Flujos de cierre, siempre necesarios? .net

Ilustrado:

static string SerialiseObjectToBase64(object obj) 
{ 
    var mstream = new MemoryStream(); 
    ... 
    return Convert.ToBase64String(mstream.ToArray());   
} 

es aceptable el código anterior?

Respuesta

12

Con un MemoryStream que es un poco de un punto discutible - ya que en última instancia está hablando con un logrado byte[] (por lo que todavía va a esperar a que la recolección de basura de rutina). Pero en general, sí: debe cerrar (mejor: Dispose() a través de using, por lo que se cierra en caso de excepción) cuando la secuencia finaliza; de lo contrario, es posible que no vacíe algunos datos en el destino subyacente (no administrado). Y hay algunas transmisiones que en realidad no se "limpian" completamente en Flush() - necesitan para ser Close() d (especialmente las corrientes de compresión).

9

Es una buena práctica cerrar las transmisiones. Use la instrucción using, y se llamará al Dispose() cuando caiga fuera del alcance (o si se lanza una excepción), lo que a su vez cerrará la transmisión.

static string SerialiseObjectToBase64(object obj) 
{ 
    using (var mstream = new MemoryStream()) 
    { 
     ... 
     return Convert.ToBase64String(mstream.ToArray()); 
    } 
} 
+1

@Greg - Ciertamente se cerrará automáticamente cuando se ejecute el finalizador. Sin embargo, no hay garantía CUÁNDO se cerrará (podría ser solo cuando el proceso finalice), de modo que usted señala que usar 'usar' siempre es una buena idea. – Aaron

+0

@ Aaron - Gracias, actualicé mi respuesta. – Greg

3

. El GC de la red es muy ... flojo. El hecho de que se haya perdido una referencia no significa que sea inmediatamente barrida, triturada y enviada al vertedero. Siempre es una buena idea cerrar los recursos abiertos y deshacerse de los objetos que implementan IDisposable por esa misma razón.

4

Cerrar las transmisiones y deshacerse de los objetos son dos cosas diferentes. El cierre de flujos vacía el buffer de escritura y escribe cualquier dato no escrito en la transmisión. La eliminación de la secuencia simplemente liberará la memoria utilizada por la variable de flujo.

+3

Esto es incorrecto. La eliminación de una secuencia * se * cerrará y vaciará ... pero * no * liberará ningún recuerdo. –

Cuestiones relacionadas