2010-10-08 5 views
8

Un de mes collègues prétend qu'en C# ayant des membres statiques dans les classes non statiques empêche les instances de ces classes d'être jamais collectées des ordures et que c'est une source commune de C# fuites de mémoire. En conséquence, il encapsule toujours les membres statiques dans une classe statique et y accède à partir d'une propriété statique ou d'une méthode sur cette classe statique. J'ai toujours pensé que les statistiques étaient sur la pile, pas sur le tas et n'avaient donc rien à voir avec la collecte des ordures. Cela ne me semble pas juste.Une question sur les membres statiques à l'intérieur des classes non statiques et garbage collection

Quelle est la vérité sur cette

Répondre

11

Il ne sait pas de quoi il parle. Les membres statiques à l'intérieur d'une classe non statique et non empêchent les instances de la classe d'être récupérées. Cela dit, la statique peut être sur la pile ou sur le tas. Cela n'a pas d'importance pour la collecte des ordures. Ce qui compte, c'est que les parties statiques d'un type ne sont pas stockées avec des instances du type.

0

Votre ami est incorrect.

L'idée d'une méthode statique est qu'il n'y a AUCUNE instance de cette classe. Il n'y a donc rien à ramasser.

Essayez de mettre this à l'intérieur d'une méthode statique dans une classe non statique et de voir ce qui se passe.

5

Les membres statiques sont des racines pour le GC. Tout ce qui est référencé à partir d'une statique sera maintenu en vie. Le fait que la référence statique soit dans une classe statique ou dans une classe non statique est sans importance. Si vous avez une classe non statique qui a un champ statique et que vous avez des instances de cette classe, le champ statique n'a pas beaucoup d'instances - cela fait partie de la définition de statique - ce n'est pas un champ par instance . Donc, que la classe elle-même soit statique ou non, cela ne fait aucune différence. Donc, oui, les références statiques sont souvent la cause de fuites de mémoire, en particulier des événements statiques dont vous ne vous êtes pas désabonné quand c'est approprié. Changer la classe pour qu'elle soit statique ne résoudra pas votre fuite de mémoire - vous devez supprimer la référence statique lorsque la durée de vie de l'instance à laquelle elle se réfère est terminée. Cela se fait souvent par l'intermédiaire de Dispose() et de l'élimination de l'abonnement de référence/événement.

This est un bon endroit pour en savoir plus sur le fonctionnement du GC, comment il identifie les déchets et ce qu'il fait à ce sujet. Ainsi que Finalisers et plus ...

Questions connexes