2009-06-23 22 views

Respuesta

26

El primero es mejor. Asegura que está dispuesto incluso si se lanza una excepción, y maneja correctamente el caso en el que Create(0) devuelve nulo (es decir, no intenta llamar al Dispose() en una instancia nula).

+0

¡Gracias! Ese era el tipo de respuesta que estaba buscando. – mkelley33

+11

Un punto menor adicional que nadie ha mencionado es que el uso de "usar" le impide mutar accidentalmente el contenido de la variable "ctx" después de su inicialización pero antes de su eliminación. No desea deshacerse accidentalmente de un objeto diferente del que creó. –

2

La instrucción using le ofrece una sintaxis agradable y protección de excepción. No puede abandonar la instrucción using sin llamar a Dispose (se traduce en un bloque finally con una llamada para deshacerse). En su segundo escenario, si tenía una excepción entre Create y Dispose, no llamaría a disponer directamente. Lo cual no es un problema a menos que esté utilizando recursos no administrados, pero si lo está, tendrá fugas.

3

Donde puede, use using por los motivos que cita Marc. OTOH: esta no es una solución con muerte cerebral, ya que a veces la vida del objeto no se puede definir como un alcance léxico, así que úsela razonablemente.

3

El único lugar donde no desea utilizar un bloque de uso es donde el objeto desechable tiene un ámbito fuera de la función. En este caso, su clase debe implementar IDisposable y deshacerse del objeto en su Dispose().

+0

Me he encontrado con casos donde la vida del objeto es más corta que la vida del propietario. – BCS

7

Una declaración using siempre es mejor porque ...

  • no se puede olvidar llamar Dispose(), así como el código se convierte en diferentes rutas de código
  • Dispose() es llamada incluso si hay una excepción. También comprueba el null antes de llamar al Dispose(), que puede ser útil (suponiendo que no solo está llamando al new).

Uno no evidente (al menos para mí) truco con using es cómo se puede evitar la anidación excesiva cuando tiene varios objetos desechables:

using (var input = new InputFile(inputName)) 
using (var output = new OutputFile(outputName)) 
{ 
    input.copyTo(output); 
} 

El formateador de código VS dejará las dos declaraciones de partida en la misma columna


De hecho, en algunas situaciones que no tienen ni siquiera para repetir la instrucción using ...

using (InputFile input1 = new InputFile(inputName1), input2 = new InputFile(inputName2)) 

Sin embargo, las restricciones para declarar múltiples variables en la misma línea se aplica aquí por lo que la los tipos deben ser iguales y no puede usar el tipo implícito var.

Cuestiones relacionadas