¿Qué es mejor y cuándo: usando una declaración o llamando a Dispose () en un IDisposable en C #?
-
06-07-2019 - |
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!
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 compruebanull
antes de llamar aDispose ()
, lo que puede ser útil (suponiendo que no solo llame anew
).
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.