se puede omitir el uso de todo el SqlCommand
. El GC eventualmente lo limpiará por ti. Sin embargo, le recomiendo encarecidamente que no haga esto. Explicaré por qué.
SqlCommand
hereda indirectamente de System.ComponentModel.Component
, y por lo tanto hereda su método Finalizer
. Si no llama a disponer de un SqlCommand
, se asegurará de que el comando se promueva al menos una generación después de que salga del alcance (el recolector de elementos no utilizados de .NET es generational gc). Por ejemplo: cuando el comando estaba en el gen 1, pasará al gen 2. Los objetos finalizables se mantienen más tiempo en la memoria para garantizar que el finalizador pueda ejecutarse con seguridad. Pero no solo el comando en sí se guarda en la memoria, sino que todos los objetos a los que hace referencia van con esa generación. Los objetos a los que hará referencia son SqlConnection
, la lista de objetos SqlParameter
, la cadena posiblemente grande CommandText
y muchos otros objetos internos a los que hace referencia.Esa memoria solo se puede eliminar cuando se recopila esa generación, pero cuanto mayor sea la generación, menos frecuentemente se barrerá.
Por lo tanto, al no realizar una llamada, se obtendrá una presión de memoria adicional y trabajo adicional para la secuencia del finalizador.
Cuando .NET no puede asignar memoria nueva, el CLR forzará la recogida de basura de todas las generaciones. Después de esto, el tiempo de ejecución generalmente tendrá suficiente espacio para asignar nuevos objetos. Sin embargo, cuando se produce esta recopilación forzada cuando hay muchos objetos en la memoria que aún deben promoverse a una próxima generación (porque son finalizables o están referenciados por un objeto finalizable), es posible que la CLR no pueda liberar suficiente memoria. Un OutOfMemoryException
será el resultado de esto.
Debo admitir que nunca he visto que esto ocurra, porque los desarrolladores no se deshicieron de sus objetos SqlCommand
. Sin embargo, he visto muchos OOM en sistemas de producción, causados por no desechar los objetos correctamente.
Espero que esto brinde un poco de información sobre cómo funciona el GC y cuál es el riesgo de no desechar correctamente el objeto (finalizable). Siempre dispongo todos los objetos desechables. Si bien una mirada en Reflector podría probar que esto no es necesariamente para cierto tipo, este tipo de programación conduce a un código que es menos sostenible y hace que el código dependa del comportamiento interno de un tipo (y este comportamiento podría cambiar en el futuro).
¿Alguna razón en particular por la cual siempre es explícito? Estas respuestas se desvían del verdadero propósito de la pregunta. – Nayan
@Nayan, mira mi comentario a tu respuesta. –
Advertencia: ¡no hagas esto para las clases Stream, ya que son las dueñas de las transmisiones aprobadas! Ver http://stackoverflow.com/questions/1065168/does-disposing-streamreader-close-the-stream – fmuecke