Oui, Dispose
sera appelé. Il est appelé dès que l'exécution quitte la portée du using
bloc, quels que soient les moyens nécessaires pour quitter le bloc, que ce soit la fin de l'exécution du bloc, une return
instruction ou une exception.
Comme @Noldorin le souligne correctement, l'utilisation d'un using
bloc dans le code est compilée dans try
/ finally
, avec Dispose
un appel dans le finally
bloc. 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 finally
est garanti de s'exécuter après la try
fin de l'exécution du bloc, quel que soit son chemin d'exécution, il Dispose
est 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 Dispose
est garanti d'être appelé, c'est presque toujours une bonne idée de s'assurer que Dispose
ne 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' Dispose
on 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' Dispose
appel. Cela peut être extrêmement frustrant. Ou est-ce frustrant? Un des deux. Peut-être les deux.