instruction using : garantir l’utilisation correcte des objets supprimables

L’instruction using garantit l’utilisation correcte d’une instance IDisposable :

var numbers = new List<int>();
using (StreamReader reader = File.OpenText("numbers.txt"))
{
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
}

Quand le contrôle quitte le bloc de l’instruction using, une instance IDisposable acquise est supprimée. En particulier, l’instruction using garantit qu’une instance supprimable est supprimée même si une exception se produit dans le bloc de l’instruction using. Dans l’exemple précédent, un fichier ouvert est fermé après le traitement de toutes les lignes.

Utilisez l’instruction await using pour utiliser correctement une instance IAsyncDisposable :

await using (var resource = new AsyncDisposableExample())
{
    // Use the resource
}

Pour plus d’informations sur l’utilisation d’instances IAsyncDisposable, consultez la section Utilisation de la suppression asynchrone de l’article Implémenter une méthode DisposeAsync.

Vous pouvez aussi utiliser une déclaration using qui ne nécessite pas d’accolades :

static IEnumerable<int> LoadNumbers(string filePath)
{
    using StreamReader reader = File.OpenText(filePath);
    
    var numbers = new List<int>();
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
    return numbers;
}

Quand elle est déclarée dans une déclaration using, une variable locale est supprimée à la fin de l’étendue dans laquelle elle est déclarée. Dans l’exemple précédent, la suppression se produit à la fin d’une méthode.

Une variable déclarée par l’instruction ou la déclaration using est en lecture seule. Vous ne pouvez pas la réaffecter ou la passer en tant que paramètre ref ou out.

Vous pouvez déclarer plusieurs instances du même type dans une instruction using, comme le montre l’exemple suivant :

using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
    // Process both files
}

Quand vous déclarez plusieurs instances dans une instruction using, elles sont supprimées dans l’ordre inverse de déclaration.

Vous pouvez aussi utiliser l’instruction et la using déclaration avec une instance d’un struct ref qui correspond au modèle supprimable. Autrement dit, il doit avoir une méthode Dispose d’instance qui soit accessible et sans paramètre, avec un type de retour void.

L’instruction using peut également avoir la forme suivante :

using (expression)
{
    // ...
}

expression produit une instance supprimable. L’exemple suivant illustre ce qui suit :

StreamReader reader = File.OpenText(filePath);

using (reader)
{
    // Process file content
}

Avertissement

Dans l’exemple précédent, une fois que le contrôle a quitté l’instruction using, une instance supprimable reste dans l’étendue alors qu’elle est déjà supprimée. Si vous utilisez cette instance plus loin, vous pouvez rencontrer une exception, par exemple ObjectDisposedException. C’est pourquoi nous vous recommandons de déclarer une variable supprimable dans l’instruction using ou avec la déclaration using.

spécification du langage C#

Pour plus d’informations, consultez la section L’instruction using de la spécification du langage C# et la note de proposition relative à « using basé sur un modèle » et « déclarations using ».

Voir aussi