web-dev-qa-db-fra.com

Si une exception se produit dans une instruction using, l'objet est-il toujours supprimé?

Si une exception se produit dans une instruction using, l'objet est-il toujours supprimé?

La raison pour laquelle je pose la question est parce que j'essaie de décider de mettre un essai coincé dans tout le bloc de code ou dans l'instruction using interne. Gardant à l'esprit que certaines exceptions sont rejetées par conception dans le bloc de capture.

using (SPSite spSite = new SPSite(url))
{
   // Get the Web
   using (SPWeb spWeb = spSite.OpenWeb())
   {
       // Exception occurs here
   }
}
52
Andrew

Oui, il le feront.

using(SPWeb spWeb = spSite.OpenWeb())
{
  // Some Code
}

est équivalent à

{
  SPWeb spWeb = spSite.OpenWeb();
  try
  {

    // Some Code
  }
  finally
  {
    if (spWeb != null)
    {
       spWeb.Dispose();
    }
  }
}

Éditer

Après avoir répondu à cette question, j'ai écrit un article plus approfondi sur la construction IDisposable and Using dans mon blog.

47
Anders Abel

Oui. Une instruction using se traduit approximativement par la construction suivante:

IDisposable x;
try
{
    ...
}
finally
{
    x.Dispose();
}
8
spender

Oui. C'est comme encapsuler votre code dans un essai final (et éliminer dans le enfin).

6
Phil Lambert

L'instruction using provoque la génération d'un modèle dispose complet et approprié, donc la réponse est oui.

2
Oded