Collecte des ordures:Est-il nécessaire de définir les gros objets sur null dans une méthode Dispose ?

StackOverflow https://stackoverflow.com/questions/49950

  •  09-06-2019
  •  | 
  •  

Question

Est-il nécessaire de définir des objets volumineux null lors de la mise en œuvre d'un Dispose() méthode?

Était-ce utile?

La solution

Pas habituellement.

Le garbage collector recherche les objets rootés et les dépendances circulaires n'empêchent pas la collecte si aucun des deux objets n'est rooté.

Il y a une mise en garde :si l'objet A a une référence à l'objet B et que l'objet B est en cours de suppression, vous souhaiterez peut-être nettoyer cette relation, sinon vous pourriez vous retrouver avec une fuite.L'endroit le plus courant où cela apparaît est dans les gestionnaires d'événements (la référence de A->B est celle que B contrôle, car elle s'est abonnée à un événement sur A).Dans ce cas, si A est toujours rooté, B ne peut pas être collecté même s'il a été supprimé.

Autres conseils

Si une classe possède une méthode Dispose, la meilleure pratique consiste à l’appeler.La raison derrière cela est que Dispose Runs lorsqu'il est appelé, tandis que le réglage de l'objet sur NULL ajoute simplement une entrée à la file d'attente finalisée dans GC, et nous ne pouvons pas déterminer quand GC s'exécutera.

Il n'y a aucun avantage en termes de performances à implémenter la méthode Dispose sur des types qui utilisent uniquement des ressources gérées (tels que des tableaux), car elles sont automatiquement récupérées par le garbage collector.Utilisez la méthode Dispose principalement sur les objets gérés qui utilisent des ressources natives et sur les objets COM exposés au .NET Framework.Les objets gérés qui utilisent des ressources natives (telles que la classe FileStream) implémentent l'interface IDisposable.

Un moyen élégant d'accepter Dispose qui a été adopté consiste à utiliser la construction "using".Pour ceux d'entre vous qui ne connaissent peut-être pas la construction, elle fournit un moyen d'invoquer implicitement Dispose() sur une instance qui implémente IDisposable même si une exception est levée pendant l'opération.Voici un exemple de construction using :

using(DisposableClass dc = new DisposableClass()) 
{ 
   dc.PerformActionOnUmanagedResources(); 
   dc.PerformAnotherActionOnUmanagedResources(); 
} 

Dans l'exemple précédent, si une exception était levée dans la méthode PerformActionOnUmanagedResources(), bien que la méthode PerformAnotherActionOnUmanagedResources() ne soit pas traitée, le bloc using invoquera toujours implicitement la méthode Dispose sur DC, garantissant la libération de toutes les ressources non gérées.

Le but d'une méthode dispose est de libérer toutes les ressources associées à votre classe et à la classe parent en appelant la méthode dispose de la classe de base.Lis ce lien, ça devrait rendre les choses un peu plus claires :

http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx

qu'entends-tu par "gros objet" ?

Cependant, vous devriez au moins appeler Dispose() sur tout membre implémentant IDisposable.

Ce n'est pas nécessaire comme d'autres l'ont souligné, mais c'est une bonne pratique et aide au débogage.

Une fois qu'un objet a terminé avec un pointeur qu'il utilise, le définir sur null permet d'empêcher la réutilisation de cet objet ultérieurement (vous obtiendrez une exception de référence nulle).

La même logique s'applique à la définition des pointeurs de membre sur null dans les destructeurs C++ une fois que vous les avez supprimés.Il n'y a pas besoin pour le faire, mais cela aide au dépannage plus tard.

Réfléchissez un peu à l’objectif des méthodes jetables :c'est généralement parce que vous détenez une ressource qui ne sera pas libérée lors du garbage collection.Il s'agit généralement d'une connexion à une base de données ou d'un descripteur de fichier.Ainsi, une fois la méthode Dispose appelée, toutes ces ressources ont été libérées.

Je dirais que le fait d'avoir des valeurs nulles flottantes est plus nocif que d'avoir des objets "zombies" flottants.

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