2011-11-23 16 views
13

Duplicar posible:
Does Dispose method still get called when Exception is thrown inside of Using statment?¿Se eliminan los recursos incluso si se lanza una excepción en un bloque de uso?

tengo un número de using bloques, cuando se accede a una base de datos. Me preguntaba: si se debe lanzar una excepción dentro del bloque de uso, ¿se eliminarán los recursos necesarios, incluso si no se llega al final del bloque? ¿O debería cerrarlos manualmente en el bloque catch?

Respuesta

26

Se eliminaron los recursos definidos con la declaración using, esta es la razón principal por la cual using es bueno.

La instrucción using asegura que Desechar se llama incluso si se produce una excepción mientras que está llamando a métodos en el objeto. Puede obtener el mismo resultado colocando el objeto dentro de un bloque try y llamando al Dispose en un bloque finally; de hecho, así es como el compilador traduce la declaración de uso .
http://msdn.microsoft.com/en-us/library/yh598w02%28v=VS.100%29.aspx

+1

+1 para el enlace a la descripción y siendo 15 sec. más rápido que yo. ;-) – Fischermaen

+0

¡Gracias! A la espera del temporizador para aceptar la respuesta :) –

+0

y mientras tanto obtengo -1 ... – Fischermaen

1

Sí, se dispondrá el recurso del uso de bloque.

1

No lo harías. En realidad, el bloque using es el mismo si usa la construcción try{}catch{}finally{} con la llamada al método Dispose en el bloque finally. Por lo tanto, se llamará de todos modos.

1

Sí, el elemento se eliminará, ya que la llamada forma parte del bloque finally del try en el que se traduce el using.

Desde 8.13 de la especificación de C#:

Una declaración utilizando se traduce en tres partes: la adquisición, uso y disposición . El uso del recurso se incluye implícitamente en una instrucción try que incluye una cláusula finally. Esta cláusula final dispone del recurso. Si se adquiere un recurso nulo, no se realiza ninguna llamada al Dispose y no se lanza ninguna excepción.

Así que no tendrá que deshacerse de él manualmente, y de todos modos no estoy seguro de dónde estaría su propio bloque catch.

Cuestiones relacionadas