why usar statement porque namespace instruction end c# dispose

usar - using namespace c#



C#USING keyword: ¿cuándo y cuándo no usarla? (3)

"¿Los IDisposables no se eliminan cuando salen del alcance?"

No. Si el objeto IDisposable es finalizable , que no es lo mismo, se finalizará cuando se recolecte la basura.

Que podría ser pronto o podría ser casi nunca.

El libro C # / CLR de Jeff Richter es muy bueno en todo esto, y el libro de Pautas de Diseño de Marco también es útil.

¿Solo necesito usar USING cuando mi objeto hace uso de Dispose para arreglarse?

Solo puedes usar ''usar'' cuando el objeto implementa IDisposable. El compilador objetará si intenta hacer lo contrario.

Me gustaría saber cuándo debo y no debería estar envolviendo cosas en un bloque de USO.

Por lo que entiendo, el compilador lo traduce en try / finally, donde finalmente llama a Dispose () en el objeto.

Siempre uso UTILIZANDO las conexiones de bases de datos y el acceso a archivos, pero es más por hábito que por comprensión al 100%. Sé que deberías explícitamente (o con un uso) Dispose () objetos que controlan los recursos, para garantizar que se liberen al instante en lugar de cuando el CLR lo parezca, pero ahí es donde se rompe mi comprensión.

¿Los IDisposables no se eliminan cuando salen del alcance?

¿Solo necesito usar USING cuando mi objeto hace uso de Dispose para arreglarse?

Gracias

Editar: Sé que hay un par de publicaciones más sobre la palabra clave USING, pero estoy más interesado en respuestas que relacionan el CLR y qué está sucediendo internamente

Andrés


Para agregar a las otras respuestas, debe usar el using (o un Dispose explícito) siempre que un objeto contenga recursos que no sean la memoria administrada. Los ejemplos serían cosas como archivos, sockets, conexiones de bases de datos o incluso identificadores de dibujo GDI.

El recolector de basura eventualmente finalizaría estos objetos, pero solo en algún momento no especificado en el futuro. No puede confiar en que suceda de manera oportuna, y es posible que se haya quedado sin ese recurso mientras tanto.


No, los artículos IDisposable no se eliminan cuando salen del alcance. Es precisamente por esta razón que necesitamos IDisposable , para una limpieza determinista.

Eventualmente obtendrán basura recolectada, y si hay un finalizador será llamado (quizás), pero eso podría pasar mucho tiempo en el futuro (no es bueno para grupos de conexión, etc.). La recolección de basura depende de la presión de la memoria: si nada quiere memoria adicional, no hay necesidad de ejecutar un ciclo de GC.

Curiosamente (tal vez) hay algunos casos donde "usar" es un dolor - cuando la clase ofensiva arroja una excepción en Dispose() veces. WCF es un ofensor de esto. He discutido este tema (con una solución simple) aquí .

Básicamente, si la clase implementa IDisposable , y usted posee una instancia (es decir, la creó o lo que sea), su trabajo es asegurarse de que sea eliminada. Eso podría significar a través de "usar", o podría significar pasarlo a otro código que asume la responsabilidad.

De hecho, he visto código de depuración del tipo:

#if DEBUG ~Foo() { // complain loudly that smoebody forgot to dispose... } #endif

(donde Dispose llama a GC.SuppressFinalize )