Sí, Disposese llamará. Se llama tan pronto como la ejecución abandona el alcance del usingbloque, independientemente de los medios que tomó para abandonar el bloque, ya sea el final de la ejecución del bloque, una returndeclaración o una excepción.
Como @Noldorin señala correctamente, el uso de un usingbloque en el código se compila en try/ finally, con la Disposellamada en el finallybloque. Por ejemplo, el siguiente código:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
efectivamente se convierte en:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
Por lo tanto, porque finallyse garantiza que se ejecutará después de que el trybloque haya finalizado la ejecución, independientemente de su ruta de ejecución, Disposese garantiza que se llamará, pase lo que pase.
Para obtener más información, consulte este artículo de MSDN .
Apéndice:
Solo una pequeña advertencia para agregar: debido a que Disposese garantiza que se llamará, casi siempre es una buena idea asegurarse de que Disposenunca se produzca una excepción cuando se implementa IDisposable. Por desgracia, hay algunas clases en la biblioteca central que hacen un tiro en ciertas circunstancias cuando Disposese llama - que estoy mirando a ti, proxy de servicio WCF Referencia / cliente! - y cuando eso sucede, puede ser muy difícil rastrear la excepción original si Disposese llamó durante un desenrollado de la pila de excepciones, ya que la excepción original se traga a favor de la nueva excepción generada por la Disposellamada. Puede resultar tremendamente frustrante. ¿O es eso frustrantemente enloquecedor? Uno de los dos. Tal vez ambos.