using, instruction (Référence C#)

Mise à jour : Juillet 2008

Fournit une syntaxe qui garantit l'utilisation correcte d'objets IDisposable.

Exemple

L'exemple suivant montre comment utiliser l'instruction using.

using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Public\Documents\test.txt"))
{
    string s = null;
    while((s = sr.ReadLine()) != null)
    {
        Console.WriteLine(s);
    }
}

Notes

File et Font sont des exemples des types managés qui accèdent aux ressources non managées (dans ce cas, des handles de fichiers et des contextes de périphérique). Beaucoup d'autres types de ressources non managées et de bibliothèques de classes peuvent les encapsuler. Tous doivent implémenter l'interface IDisposable.

En règle générale, lorsque vous utilisez un objet IDisposable, vous devez le déclarer et l'instancier dans une instruction using. L'instruction using appelle la méthode Dispose sur l'objet et, si vous l'utilisez comme indiqué précédemment, met l'objet hors de portée dès que Dispose est appelé. Dans le bloc using, l'objet est en lecture seule et ne peut être ni modifié ni réassigné.

L'instruction using garantit que Dispose est appelé même si une exception se produit lors de l'appel de méthodes sur l'objet. Vous pouvez obtenir le même résultat en plaçant l'objet dans un bloc try puis en appelant Dispose dans un bloc finally ; c'est d'ailleurs ainsi que l'instruction using est traduite par le compilateur. L'exemple de code précédent se développe vers le code suivant à la compilation (notez les accolades supplémentaires qui limitent la portée de l'objet) :

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

Plusieurs objets peuvent être utilisés avec une instruction using, mais ils doivent être déclarés à l'intérieur de l'instruction using, comme dans l'exemple suivant :

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

Il n'est pas conseillé d'instancier l'objet de ressource puis de passer la variable à l'instruction using. En effet, l'objet reste dans la portée une fois que le contrôle a quitté le bloc using, même s'il ne peut probablement plus accéder à ses ressources non managées. En d'autres termes, il ne sera plus complètement initialisé. Si vous essayez d'utiliser l'objet à l'extérieur du bloc using, vous risquez de provoquer la levée d'une exception. C'est pourquoi il vaut mieux instancier l'objet dans l'instruction using et limiter sa portée au bloc using.

Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
    // use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight(); 


Spécification du langage C#

Pour plus d'informations, consultez les sections suivantes dans Spécifications du langage C#.

  • 5.3.3.17 Instructions using

  • 8.13 L'instruction using

Voir aussi

Concepts

Guide de programmation C#

Implémentation d'une méthode Dispose

Référence

Mots clés C#

using, directive (Référence C#)

Implémentation des méthodes Finalize et Dispose pour nettoyer des ressources non managées

Autres ressources

Référence C#

Garbage collection

Historique des modifications

Date

Historique

Raison

Juillet 2008

Exemple de code ajouté après l'introduction

Résolution des bogues de contenu.