Oui, Dispose
sera appelée. Il est appelé dès que l'exécution laisse le champ d'application de l' using
bloc, indépendamment de ce qui signifie qu'il a fallu pour quitter le bloc, que ce soit la fin de l'exécution du bloc, return
déclaration, ou une exception.
@Noldorin souligne à juste titre, à l'aide d'un using
bloc de code est compilé en try
/finally
, Dispose
appelée dans l' finally
bloc. Par exemple le code suivant:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
devient:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
Donc, parce qu' finally
est garanti pour exécuter après l' try
bloc a fini de l'exécution, quel que soit son chemin d'exécution, Dispose
est garanti pour être appelé, n'importe quoi.
Pour plus d'informations, voir cet article MSDN.
Addendum:
Juste un petit bémol à ajouter: parce qu' Dispose
est garanti pour être appelé, c'est presque toujours une bonne idée pour s'assurer qu' Dispose
jamais déclenche une exception lorsque vous implémentez IDisposable
. Malheureusement, il y a certaines classes dans la bibliothèque de base qui ne jeter, dans certaines circonstances, lorsqu' Dispose
est appelé -- je suis à la recherche à vous, WCF Service de Référence / Proxy Client! - et quand cela arrive, il peut être très difficile de traquer l'exception d'origine si Dispose
a été appelée au cours d'une pile d'exception détendez-vous, depuis la première exception est avalé en faveur de la nouvelle exception générée par l' Dispose
appel. Il peut être maddeningly frustrant. Ou est-ce frustrant exaspérante? L'un des deux. Peut-être les deux.