¿Cuándo debería disponer mis objetos en .NET?


Answers

Si el objeto implementa IDisposable, debe deshacerse de él tan pronto como haya terminado con él. La forma más fácil es rodearlo con un bloque de uso :

using (SqlCommand cmd = new SqlCommand(conn)) {
    cmd.ExecuteNonQuery();
}
Question

Para el código general, ¿realmente necesito deshacerme de un objeto? ¿Puedo ignorarlo en su mayor parte o es una buena idea desechar siempre un objeto cuando esté 100% seguro de que ya no lo necesita?




Confiar en el GC 'funciona' en la mayoría de los casos. La excepción clásica es cuando tienes una interacción de recurso pesado: en ese caso, lo mejor es disponer explicitamente.

obvio, por ej.

using (var conn = new SqlConnection(connString)) {}

Los bloques "de uso" son definitivamente el método más limpio y sólido para garantizar que los objetos se eliminen correctamente. Los bloques 'Using' se pueden aprovechar con cualquier objeto que implemente IDisposable.




Cuando termines con un objeto, puedes olvidarte de él. Siempre y cuando no se haga referencia en ningún lugar, ya está perdido. La memoria que utiliza se libera cuando el recolector de basura lo desea.




Hay un par de maneras de verlo. Una manera de averiguar si es realmente necesario deshacerse de un objeto tan pronto como ya no lo necesite, por ejemplo, utilizando Reflector para ver si realmente se está reteniendo en recursos no administrados, o si de todos modos se eliminaron de manera incidental. La otra perspectiva es suponer que si un objeto implementa IDisposable, no es su responsabilidad determinar si realmente necesita llamarse a Dispose (), siempre lo llama. Creo que ese es el camino correcto a seguir. Mirar detenidamente la implementación privada de los objetos para tomar decisiones sobre cómo debe consumirlos aumenta el riesgo de que se acople a una implementación que podría cambiar. Un ejemplo es LINQ to SQL DataContext. Implementa IDispose pero principalmente limpia después de sí mismo sin la necesidad de una llamada explícita a Dispose (). Mi preferencia es escribir código que explícitamente disponga de todos modos, pero otros han sugerido que no es necesario.

Por supuesto, todo esto se aplica a los objetos que implementan IDisposable. Es cierto que el GC se encargará de casi todo lo demás sin ninguna acción explícita de su parte, pero vale la pena leer un poco sobre las sutilezas del comportamiento del GC (estoy demasiado cansado para pensar en los detalles ahora mismo) para saber cuándo deshacerse de los objetos explícitamente, y más importante aún, cuándo implementar IDispose. Hay muchos buenos artículos sobre interwebs sobre el tema.

Y como dije anteriormente, usar (...) {...} es su amigo para implementadores IDisposables.