L'instruction indispensable en C#: using
Aujourd’hui, je vous présente une instruction très particulière introduite dans le langage C# (depuis la V1).
J’aime beaucoup cette instruction car elle permet de faire du code propre et efficace. Il s’agit en effet de l’instruction using en C#.
Using est tout d’abord utilisé pour importer des références depuis des namespaces (directive using).
Using est aussi utilisé en tant qu’instruction dans un bloc de code et ce que nous allons voir désormais.
Pour ceux qui ont déjà travaillé avec des ressources systèmes, des connexions sockets, bases de données, vous savez qu’il faut toujours fermer ces ressources à la fin de votre traitement ou en cas d’erreur.
Ce type de pattern de développement introduit toujours du code redondant: un traitement à faire à la fin « normale » et un traitement en cas d’erreur.
Le langage C# introduit les instructions try … finally qui permettent de gérer ce type de mécanisme.
Par exemple:
StreamReader reader = new StreamReader("MonFichier.txt");
try
{
s = reader.ReadLine();
}
finally
{
reader.Close();
}
Vous remarquerez que ce code est déjà pas mal en terme de clarté (par rapport à du C je veux dire).
Néanmoins, le langage C# permet d’aller plus loin avec le pattern IDisposable et l’instruction using.
Avec l’exemple ci-dessous (équivalent), vous comprendrez tout de suite:
using (StreamReader reader = new StreamReader("MonFichier.txt"))
{
s = reader.ReadLine();
}
// Ici à la fin du bloc, le compilateur effectue
// un appel automatique à reader.Dispose().
L’instruction using doit être utilisée avec une classe qui implémente IDisposable (contient une méthode Dispose()). A la fin du bloc de code, le compilateur génère un appel à la méthode Dispose de cet objet.
Dans notre cas, StreamReader ferme le fichier et libère donc les ressources. Intéressant non?
J’aime bien parler de cette instruction car je la trouve sympa à utiliser (impossible d’oublier le close), il est possible de faire un return n’importe où, ce qui permet en général de simplifier le code au final (en terme de lisibilité).
L’instruction using peut être utilisée avec plusieurs objets et de manière imbriquée.
Par exemple:
using (StreamReader reader = new StreamReader("MonFichier.txt"))
{
using (StreamWriter writer = new StreamWriter("MaSortie.txt"))
{
// traitement…
}
}
Ceci est équivalent à ce code:
using (StreamReader reader = new StreamReader("MonFichier.txt"),
StreamWriter writer = new StreamWriter("MaSortie.txt"))
{
}
Je vous laisse désormais pratique par vous-même. Je vous invite fortement à utiliser cette instruction. Après plusieurs utilisations vous ne pourrez plus vous en passer.