Votre question concernant la nécessité ou non de toujours appeler Dispose
est généralement un débat animé. Voir ce pour obtenir une perspective intéressante de la part de personnes respectées de la communauté .NET.
Personnellement, je pense que la position de Jeffrey Richter qui consiste à appeler Dispose
n'est pas obligatoire est incroyablement faible. Il donne deux exemples pour justifier son opinion.
Dans le premier exemple, il dit appeler Dispose
sur les contrôles Windows Forms est fastidieuse et inutile dans les scénarios courants. Cependant, il omet de mentionner que Dispose
est en fait appelé automatiquement par les conteneurs de contrôle dans ces scénarios courants.
Dans le second exemple, il indique qu'un développeur peut supposer à tort que l'instance de IAsyncResult.WaitHandle
devrait être éliminé de manière agressive sans se rendre compte que la propriété initialise paresseusement le gestionnaire d'attente, ce qui entraîne une pénalité de performance inutile. Mais, le problème avec cet exemple est que la propriété IAsyncResult
n'est pas conforme aux directives publiées par Microsoft pour le traitement de l'information. IDisposable
objets. C'est-à-dire que si une classe détient une référence à une IDisposable
alors la classe elle-même doit implémenter IDisposable
. Si IAsyncResult
a suivi cette règle puis sa propre Dispose
pourrait prendre la décision de savoir lequel de ses membres constitutifs doit être éliminé.
Donc, à moins que quelqu'un n'ait un argument plus convaincant, je vais rester dans le camp de "toujours appeler Dispose", tout en sachant qu'il y aura quelques cas marginaux qui découleront principalement de mauvais choix de conception.
6 votes
En effet, vous devez appeler Dispose sur chaque objet Disposable. Vous pouvez le faire facilement en utilisant la fonction
using
construire.0 votes
Ah, ça a du sens. Je me suis toujours demandé pourquoi l'instruction "using" était utilisée pour les flux de fichiers. Je sais que cela avait quelque chose à voir avec la portée de l'objet, mais je ne l'avais pas mis en relation avec l'interface IDisposable.
6 votes
Un point important à retenir est qu'un finisseur doit jamais d'accéder à tout membre géré d'une classe, car ces membres peuvent ne plus être des références valides.