Il existe différentes utilisations valables de IDisposable
. Un exemple simple est le maintien d'un fichier ouvert, qui doit être fermé à un moment donné, dès que vous n'en avez plus besoin. Bien sûr, vous pouvez fournir une méthode Close
mais l'avoir dans Dispose
et en utilisant un modèle comme using (var f = new MyFile(path)) { /*process it*/ }
serait plus sûr pour les exceptions.
Un exemple plus populaire serait de tenir un autre IDisposable
ressources, ce qui signifie généralement que vous devez fournir votre propre Dispose
afin de les éliminer également.
En général, dès que vous voulez avoir une destruction déterministe de quelque chose, vous devez implémenter IDisposable
.
La différence entre mon opinion et la vôtre est que je mets en oeuvre IDisposable
dès qu'une ressource a besoin déterministe destruction/libération, non nécessaire dans les plus brefs délais . S'en remettre au ramassage des déchets n'est pas une option dans ce cas (contrairement à ce que prétend votre collègue), car il se produit à un moment imprévisible, et peut même ne pas se produire du tout !
Le fait qu'une ressource ne soit pas gérée sous la couverture ne signifie rien : le développeur doit penser en termes de " quand et comment il est bon de disposer de cet objet " plutôt que de " comment cela fonctionne sous la couverture ". L'implémentation sous-jacente peut changer avec le temps de toute façon.
En fait, l'une des principales différences entre C# et C++ est l'absence de destruction déterministe par défaut. Le site IDisposable
vient combler le fossé : vous pouvez ordonner la destruction déterministe (bien que vous ne puissiez pas vous assurer que les clients l'appellent ; de la même manière qu'en C++ vous ne pouvez pas être sûr que les clients appellent delete
sur l'objet).
Petit complément : quelle est en réalité la différence entre le déterministe libérer les ressources et les libérer dans les plus brefs délais ? En fait, ce sont des notions différentes (mais pas complètement orthogonales).
Si les ressources doivent être libérées de manière déterministe Cela signifie que le code client devrait avoir la possibilité de dire "Maintenant, je veux que cette ressource soit libérée". En fait, ce n'est peut-être pas le le plus tôt possible le moment où la ressource peut être libérée : l'objet qui détient la ressource peut avoir obtenu tout ce dont il a besoin de la ressource, donc potentiellement il peut déjà libérer la ressource. D'un autre côté, l'objet peut choisir de conserver la ressource (généralement non gérée) même après la libération de l'objet. Dispose
s'est déroulée, en ne la nettoyant que dans le finaliseur (si le fait de conserver la ressource pendant trop longtemps ne pose pas de problème).
Donc, pour libérer la ressource dans les plus brefs délais à proprement parler, Dispose
n'est pas nécessaire : l'objet peut libérer la ressource dès qu'il se rend compte lui-même que la ressource n'est plus nécessaire. Dispose
sert cependant d'indice utile pour indiquer que l'objet lui-même n'est plus nécessaire, alors peut-être que les ressources peut être libéré à ce moment-là, le cas échéant.
Un autre ajout nécessaire : les ressources non gérées ne sont pas les seules à nécessiter une désallocation déterministe ! Cela semble être l'un des points clés de la différence d'opinions entre les réponses à cette question. On peut avoir une construction purement imaginative, qui peut avoir besoin d'être libérée de manière déterministe.
Exemples : un droit d'accès à une structure partagée (pensez à Serrure RW ), un gros morceau de mémoire (imaginez que vous gérez manuellement une partie de la mémoire du programme), une licence pour l'utilisation d'un autre programme (imaginez que vous n'êtes pas autorisé à exécuter plus de X copies d'un programme simultanément), etc. Ici, l'objet à libérer n'est pas une ressource non gérée, mais une droite pour faire/utiliser quelque chose, qui est une construction purement interne à la logique de votre programme.
Petit ajout : voici une petite liste d'exemples soignés d'utilisation de l'[ab]utilisation. IDisposable
: http://www.introtorx.com/Content/v1.0.10621.0/03_LifetimeManagement.html#IDisposable .