11
votes

Une question sur les membres statiques dans des classes non statiques et la collecte des ordures

Un collègue de mine affirme que, dans C #, les membres statiques des classes non statiques empêchent les instances de ces classes de toujours être des ordures collectées et qu'il s'agit d'une source courante de fuites de mémoire C #. En conséquence, il enveloppe toujours des membres statiques dans une classe statique et gagne-leur d'y avoir accès à partir de là via une propriété statique ou une méthode (s) sur cette classe statique. J'ai toujours pensé que les statiques étaient sur la pile, pas le tas et n'avait rien à voir avec la collection de la poubelle. Cela ne me semble pas juste.

Quelle est la vérité à ce sujet?


0 commentaires

3 Réponses :


12
votes

Il ne sait pas de quoi il parle. Les membres statiques à l'intérieur d'une classe non statique font non empêchent les instances de la classe d'être détruites.

Cela dit, la statique peut être sur la pile ou le tas. Peu importe la collecte des ordures. Ce qui compte est que les parties statiques d'un type ne sont pas stockées avec des instances du type.


0 commentaires

1
votes

Votre ami est incorrect.

L'idée d'une méthode statique est qu'il n'y a pas d'instance de cette classe. Donc, rien n'existe pour les ordures.

essayez de mettre ceci à l'intérieur d'une méthode statique dans une classe non statique et voyez ce qui se passe.


0 commentaires

5
votes

Les membres statiques sont des racines pour le GC. Quelque chose de référencé d'un statique sera conservé en vie. Si la référence statique est dans une classe statique ou dans une classe non statique n'est pas pertinente.

Si vous avez une classe non statique qui a un domaine statique et que vous avez des cas de cette classe, le champ statique n'a pas de nombreuses instances - cela fait partie de la définition de statique - ce n'est pas un champ par instance. Donc, si la classe elle-même est statique ou ne fait aucune différence.

Donc, oui, les références statiques sont souvent une cause de fuites de mémoire, en particulier des événements statiques que vous n'avez pas désabonné de la mesure appropriée. Changer la classe à être 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 qu'il fait référence est terminée. Souvent, cela se fait par éliminer () l'objet et disposons de nettoyer l'abonnement de référence / événement.

Ce est un bon endroit pour en savoir plus sur la façon dont le gc Travaille, comment il identifie les ordures et ce qu'elle fait à ce sujet. Ainsi que les finaliseurs et plus ...


0 commentaires