L’instruction using en C#

27 July 2006 | Programmation

Deux utilisations principales du mot clé using sont possibles :

  • soit en tant que directive, pour créer un alias pour un espace de noms ou importer des types définis dans d’autres espaces de noms.
  • soit en tant qu’instruction, pour définir une portée au bout de laquelle un objet est supprimé.

Je vais m’intéresser au cas de l’instruction et montrer différentes formes qu’elle peux prendre, en rappelant que dans ce cas, using est réservée aux objets appartenant à des classes qui implémentent l’interface IDisposable.

Les exemples à suivre illustrent l’emploi de 2 objets StreamReader r1 et r2, utilisés pour lire une ligne dans un fichier texte et l’afficher en mode console.

Le but recherché est de simplifier l’écriture de la séquence d’instruction, en proposant 3 exemples fonctionnellement équivalents.

1er exemple : Le code est clair mais un grand nombre d’instructions using imbriquées et entre parenthèses pourraient en alourdir l’écriture, chaqueimbrication engendrant unniveau d’indentation.

using ( StreamReader r1 = new StreamReader( File.Open( @"c:\text.txt", FileMode.Open, FileAccess.Read, FileShare.Read )))
{
    using ( StreamReader r2 = new StreamReader( File.Open( @"c:\text.txt", FileMode.Open, FileAccess.Read, FileShare.Read )))
    {
        Console.WriteLine( r1.ReadLine());
        Console.WriteLine( r2.ReadLine());
    }
}

2ème exemple : Le premier using porte sur une seule instruction, qui est le second using. Dans ce cas de figure, les parenthèses inutiles sont supprimées et les instructions using sont placées les unes en dessous des autres, pour rendre le niveau d’indentation constant.

using ( StreamReader r1 = new StreamReader( File.Open( @"c:\text.txt", FileMode.Open, FileAccess.Read, FileShare.Read )))
using ( StreamReader r2 = new StreamReader( File.Open( @"c:\text.txt", FileMode.Open, FileAccess.Read, FileShare.Read )))
{
    Console.WriteLine( r1.ReadLine());
    Console.WriteLine( r2.ReadLine());
}

3ème exemple : Dans le cas particulier où des instructions using portent sur des objets du même type, on peut utiliser une seule instruction using et factoriser les déclarations des objets. Nous obtenons ainsi la séquence la plus compacte des 3 proposées, sans y perdre en lisibilité.

using ( StreamReader r1 = new StreamReader( File.Open( @"c:\text.txt", FileMode.Open, FileAccess.Read, FileShare.Read )), r2 = new StreamReader( File.Open( @"c:\text.txt", FileMode.Open, FileAccess.Read, FileShare.Read )))
{
    Console.WriteLine( r1.ReadLine());
    Console.WriteLine( r2.ReadLine());
}

Poster un commentaire