Lors d’un gros projet, il est important pour garder de bonnes performances de bien manager les ressources. Une astuce pour éviter bien des problèmes avec l’utilisation des classes implémentant l’interface IDisposable, est d’utiliser l’instruction using. Prenons deux cas problèmatiques: Votre application ouvre des fichiers en lectures avec un StreamReader. Ces fichiers sont dès lors locké et ne peuvent plus être accédé en écriture. Si pour une raison le code n’atteint pas l’appel à Dispose(), les ressources ne seront pas libérées. Cela signifie que votre fichier restera locké jusqu’à la fin d’exécution de votre code. Un deuxième exemple, avec des SqlConnection cette-fois. Si votre code n’atteint jamais Dispose() ou Close(), vos connections resteront actives même si une exception a eu lieu pendant une requête. Le problème est que le risque d’atteindre la limite du pool de connexion existe, et à ce moment votre base de données n’acceptera plus aucune connexion. Pour illustrer la bonne pratique à suivre, nous allons utiliser un StreamReader:
StreamReader streamReader = new StreamReader("monFichier"); String line; while((line = streamReader.ReadLine()) != null) { Console.WriteLine(line); } streamReader.Dispose();
Dans cet exemple, même si les risques sont faibles, la dernière instruction pour ne jamais être atteinte. Dans ce cas on se retrouvera avec un fichier locké.
Une solution plus acceptable est d’utiliser les try-catch:
StreamReader streamReader = null; try { streamReader = new StreamReader("monFichier"); String line; while((line = streamReader.ReadLine()) != null) { Console.WriteLine(line); } }catch(Exception e){ // Gestion des exceptions }finally{ streamReader.Dispose(); }
Dans ce cas-ci, quoi qu’il arrive on libèrera toujours la mémoire. Cette solution est équivalente à la dernière que je vais vous présenter, mais vous allez voir qu’il y a moyen de faire un code beaucoup plus joli!
using(StreamReader streamReader = new StreamReader("monFichier")){ String line; while((line = streamReader.ReadLine()) != null) { Console.WriteLine(line); } }
Et voilà, ça suffit. L’instruction using s’occupe d’appeler Dispose() sur les objets dont elle s’occupe dès qu’on sort du bloc d’instruction. Cette pratique est recommandée pour toutes les classes implémentant l’interface IDisposable! A savoir: cette instruction peut aussi s’utiliser pour des cas plus complexes et augmentera fortement la lisibilité du code. Vous pouvez par exemple sans problème gérer plusieurs objets comme ceci:
using ( StreamReader r1 = new StreamReader("monFichier1"), r2 = new StreamReader("monFichier2")) { Console.WriteLine( r1.ReadLine()); Console.WriteLine( r2.ReadLine()); }
Source : http://blog.maddev.eu/2011/linstruction-using-en-c
No Comments