Question

Quel est le but de l'implémentation de l'interface IDisposable? J'ai vu des classes implémenter et je ne comprends pas pourquoi.

Était-ce utile?

La solution

Si votre classe crée des ressources non gérées, vous pouvez implémenter IDisposable afin que ces ressources soient nettoyées correctement lors de la suppression de l'objet. Vous annulez Dispose et libérez-les là.

Autres conseils

Lorsque vos classes utilisent une ressource système, il incombe à la classe de s'assurer que la ressource est également libérée. Par conception .Net, vous êtes censé faire cela dans la méthode Dispose de la classe. L’interface IDisposable indique que votre classe doit libérer des ressources quand elle n’est plus utilisée et la méthode Dispose est rendue disponible pour que les utilisateurs de votre classe puissent l’appeler afin de libérer les ressources utilisées.

La méthode IDisposable est également essentielle si vous souhaitez que le nettoyage automatique fonctionne correctement et que vous utilisiez l'instruction using ().

En plus de libérer des ressources non gérées, les objets peuvent également effectuer certaines opérations dès qu’ils sortent de leur champ de vision. Un exemple utile pourrait être un objet timer: de tels objets pourraient afficher le temps écoulé depuis leur construction dans la méthode Dispose (). Ces objets peuvent ensuite être utilisés pour enregistrer la durée approximative prise pour un ensemble d'opérations:

using(Timer tmr=new Timer("blah"))
{
    // do whatever
}

Cela peut être fait manuellement, bien sûr, mais j’ai le sentiment qu’il faut profiter autant que possible de la capacité du compilateur à générer automatiquement le bon code.

Tout a à voir avec le mécanisme de récupération de place. Chris Sells décrit la récupération de place, les finaliseurs et la raison du modèle Dispose (et de l'interface IDisposable) Épisode 10 de .NET Rocks! (débutant environ 34 minutes).

De nombreux objets manipulent d'autres entités de manière à causer des problèmes s'ils ne sont pas nettoyés. Ces autres entités peuvent être presque n'importe quoi et presque n'importe où. Par exemple, un objet Socket peut demander à une autre machine d'ouvrir une connexion TCP. Cette autre machine pourrait ne pas être capable de gérer plusieurs connexions à la fois. En effet, il pourrait s'agir d'un appareil Web compatible ne pouvant gérer qu'une connexion à la fois. Si un programme ouvrait une prise et l'oubliait tout simplement, aucun autre ordinateur ne serait en mesure de se connecter à l'appliance tant que la prise ne serait pas fermée (peut-être que l'appliance pourrait fermer la prise elle-même après quelques minutes d'inactivité, serait inutile jusque-là).

Si un objet implémente IDisposable, cela signifie qu'il dispose des connaissances et de l'élan nécessaires pour effectuer les opérations de nettoyage nécessaires. Ces actions doivent être exécutées avant que ces connaissances et cet élan ne soient perdus. En appelant IDisposable.Dispose, vous vous assurez que toutes ces opérations de nettoyage sont effectuées, l'objet pouvant alors être abandonné en toute sécurité.

Microsoft permet aux objets de demander la protection contre l'abandon en enregistrant une méthode appelée Finalize. Si un objet le fait, la méthode Finalize sera appelée si le système détecte que l'objet a été abandonné. Ni l'objet, ni les objets auxquels il renferme des références directes ou indirectes, ne seront effacés de la mémoire tant que la méthode Finalize n'aura pas eu la chance de s'exécuter. Cela fournit quelque chose d'un "backstop" dans le cas où un objet est abandonné sans être d'abord éliminé. Il existe toutefois de nombreux pièges avec les objets qui implémentent Finalize, car rien ne garantit à quel moment l'appel sera appelé. Non seulement un objet peut-il être abandonné longtemps avant que Finalize ne soit appelé, mais s'il ne fait pas attention, le système peut appeler Finalize sur un objet alors qu'une partie de celui-ci est encore utilisée. Des trucs dangereux. Mieux vaut utiliser correctement Dispose.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top