Aucun des guides/notes/articles qui traitent du modèle IDisposable
ne suggère que les membres internes doivent être définis sur null
dans la méthode Dispose(bool)
(en particulier s'il s'agit de bêtes de mémoire). Je viens de réaliser l'importance de cela tout en déboguant un outil de référence interne. Ce qui se passait autrefois, c'était que ce tampon contenait un grand tableau à l'intérieur. Nous avions l'habitude d'utiliser un tampon statique pour l'ensemble du programme de référence. Une fois que nous en aurons terminé avec le tampon, nous n'aurions aucun moyen de libérer ce tableau interne, nous ne pourrions pas non plus rendre ce tampon libérable (car il était statique). Donc, je crois que, après Dispose()
, je crois que la classe devrait faire tout ce qu'elle peut pour libérer toutes les ressources qu'elle utilise et les rendre disponibles à nouveau, même si l'objet n'est pas récupéré par lui-même. GC, et ne pas mettre les membres à zéro, ce qui ne permet pas aux objets internes d'être collectés par le GC implique que l'implémentation de Dispose n'est pas parfaite.Dans l'implémentation de la méthode Dispose (bool), ne devrait-on pas mettre les membres à zéro?
Quelle est votre opinion à ce sujet?
Marc, vous devez * toujours * mettre les événements à zéro !!! Cela peut provoquer une fuite de mémoire dans certains cas. Upvote: bonne réponse –
Que "quelques instances" se rapporte probablement à l'infâme problème "d'événements statiques" qui a planté un robot. Tant que l'objet est finalement admissible à la récupération de place, les événements ne provoquent normalement pas directement de fuites de mémoire. Cependant, les événements statiques ne sont jamais collectés - essayez de les éviter si possible ;-p –
Et bien sûr, les événements statiques ne sont pas liés à IDisposable (qui est un concept d'instance). Donc, même si je suis d'accord avec la définition des événements à null, il n'est pas tout à fait vrai d'affirmer que cela peut causer des fuites de mémoire ... mieux vaut libérer tôt, cependant. –