¿Aún se llama a Dispose cuando se lanza una excepción dentro de una instrucción using?

En el siguiente ejemplo, ¿la conexión se cerrará y desechará cuando se produzca una excepción si está dentro de una instrucción using ?

 using (var conn = new SqlConnection("...")) { conn.Open(); // stuff happens here and exception is thrown... } 

Sé que este código a continuación se asegurará de que lo haga, pero tengo curiosidad de cómo lo hace el uso de la statement.

 var conn; try { conn = new SqlConnection("..."); conn.Open(); // stuff happens here and exception is thrown... } // catch it or let it bubble up finally { conn.Dispose(); } 

Relacionado:

¿Cuál es la forma correcta de garantizar que una conexión SQL se cierre cuando se lanza una excepción?

Sí, al using su código en un bloque try / finally donde la porción final llamará a Dispose() si existe. Sin embargo, no llamará directamente a Close() ya que solo verifica la interfaz IDisposable que se está implementando y, por lo tanto, el método Dispose() .

Ver también:

  • Interceptar una excepción dentro de IDisposable.Disponer
  • ¿Cuál es la forma correcta de garantizar que una conexión SQL se cierre cuando se lanza una excepción?
  • C # “Utilizando” la syntax
  • C # USING keyword: ¿cuándo y cuándo no usarla?
  • ‘using’ statement vs ‘try finally’
  • ¿Qué es el bloque C # Using y por qué debería usarlo?
  • Desechable usando el patrón
  • ¿Finaliza el uso de cerrar una conexión de SQL abierta

Así es como el reflector decodifica el IL generado por su código:

 vacío estático privado Principal (cadena [] args)
 {
     SqlConnection conn = new SqlConnection ("...");
     tratar
     {
         conn.Open ();
         Hacer cosas();
     }
     finalmente
     {
         if (conn! = null)
         {
             conn.Dispose ();
         }
     }
 }

Entonces la respuesta es sí, cerrará la conexión si

  Hacer cosas() 

arroja una excepción.