¿Qué es mejor y cuándo: usando una declaración o llamando a Dispose () en un IDisposable en C #?

StackOverflow https://stackoverflow.com/questions/1034639

Pregunta

Supongamos que tengo lo siguiente:

using(var ctx = DataContextFactory.Create(0))
{ ... Some code ... }

¿Por qué no hacer lo siguiente y perder un par de llaves ?:

var ctx = DataContextFactory.Create(0);
ctx.Dispose();

¡Gracias por el consejo!

¿Fue útil?

Solución

El primero es mejor. Asegura que se elimine incluso si se produce una excepción, y maneja correctamente el caso donde Create (0) devuelve nulo (es decir, no intenta llamar a Dispose () en una instancia nula).

Otros consejos

Una instrucción usando siempre es mejor porque ...

  • no puede olvidarse de llamar a Dispose () , incluso si el código evoluciona hacia diferentes rutas de código
  • Se llama a
  • Dispose () incluso si hay una excepción. También comprueba null antes de llamar a Dispose () , lo que puede ser útil (suponiendo que no solo llame a new ).

Un truco no obvio (para mí, de todos modos) con usando es cómo puede evitar el anidamiento excesivo cuando tiene múltiples 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 comenzando en la misma columna.


De hecho, en algunas situaciones ni siquiera tiene que repetir la declaración de uso ...

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 aplican aquí, por lo que los tipos deben ser los mismos y no puede usar el tipo implícito var .

Donde pueda, use using por las razones que cita Marc. OTOH, esta no es una solución mortal, ya que a veces la vida útil del objeto no se puede definir como un alcance léxico, así que úselo razonablemente.

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

La declaración de uso le ofrece una buena sintaxis más protección de excepción. No puede dejar la instrucción de uso sin llamar a Dispose (se traduce en un bloque finalmente con una llamada para deshacerse). En su segundo escenario, si tuviera una excepción entre Crear y Eliminar, no llamaría a eliminar directamente. Lo cual no es un problema a menos que esté utilizando recursos no administrados, pero si lo está, tendrá fugas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top