Oui, Disposesera appelé. Il est appelé dès que l'exécution quitte la portée du usingbloc, quels que soient les moyens nécessaires pour quitter le bloc, que ce soit la fin de l'exécution du bloc, une returninstruction ou une exception.
Comme @Noldorin le souligne correctement, l'utilisation d'un usingbloc dans le code est compilée dans try/ finally, avec Disposeun appel dans le finallybloc. Par exemple le code suivant:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
devient effectivement:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
Ainsi, parce qu'il finallyest garanti de s'exécuter après la tryfin de l'exécution du bloc, quel que soit son chemin d'exécution, il Disposeest garanti d'être appelé, quoi qu'il arrive.
Pour plus d'informations, consultez cet article MSDN .
Addendum:
Juste une petite mise en garde à ajouter: car il Disposeest garanti d'être appelé, c'est presque toujours une bonne idée de s'assurer que Disposene lève jamais d'exception lorsque vous implémentez IDisposable. Malheureusement, il y a des classes dans la bibliothèque de base qui font un jet dans certaines circonstances , lorsque l' Disposeon appelle - je vous regarde, WCF Service de référence / Client Proxy! - et lorsque cela se produit, il peut être très difficile de retrouver l'exception d'origine si elle a Disposeété appelée lors d'un déroulement de pile d'exceptions, puisque l'exception d'origine est avalée au profit de la nouvelle exception générée par l' Disposeappel. Cela peut être extrêmement frustrant. Ou est-ce frustrant? Un des deux. Peut-être les deux.