Comment et quand sont c# Static membres éliminés?
J'ai une classe avec de nombreuses membres statiques, certains de ceux qui gardent les références aux gérés et non gérés objets.
Par exemple, le constructeur statique est appelée dès que le Type est référencé, ce qui provoque ma classe de spin un blockingQueue de Tâches. Cela se produit lorsque l'une des méthodes statiques est appelé, par exemple.
J'ai mis en place IDisposable, ce qui me donne des méthodes pour gérer disposition sur toute instance objets que j'ai créé. Cependant, ces méthodes ne sont jamais appelés, si le consommateur ne crée pas des objets d'instance de ma classe.
Comment et où dois-je mettre le code de disposer de références maintenu par la partie statique de ma classe? J'ai toujours pensé que l'élimination de l'électricité statique ressources référencées qui s'est passé lors de la dernière instance de l'objet a été publié; c'est la première fois que j'ai jamais créé une classe où aucune instance ne peut jamais être créé.
- Des éléments statiques sont disponibles pour l'ensemble de l'exécution de l'application. Vous ne créez pas d'éléments statiques en utilisant le NOUVEAU mot-clé, donc cela signifie que vous n'avez pas plusieurs instances de quoi que ce soit, car vous n'avez pas instancier quoi que ce soit. Sur les objets gérés, ne vous inquiétez pas à ce sujet, l'GC de prendre soin d'eux. À propos de ressources non managées, essayez de les utiliser dans un non statique de la classe, ou ils seront conservés jusqu'à ce que vous fermez votre application. Des éléments statiques ne supportent pas la jeter.
- Merci. Semble que j'ai besoin de revoir ma conception ici.
Vous devez vous connecter pour publier un commentaire.
La variable statique de votre classe ne sont pas des ordures collectées jusqu'à ce que le domaine d'application de l'hébergement de votre classe est déchargée. Le
Dispose()
méthode ne sera pas appelé, parce que c'est une méthode d'instance, et vous avez dit que vous ne créez pas de toutes les instances de votre classe.Si vous souhaitez faire usage de la
Dispose()
méthode, faites votre objet singleton, créer une instance de celle-ci, et d'en disposer de façon explicite lorsque votre application est sur le point de quitter.Vous devez disposer de ce manuellement les objets, il n'y a aucun moyen de créer un "outil de finalisation" pour les ressources statiques.
Interlocked
classe dans le constructeur/destructeur/débarrasser de la méthode).Si vous voulez vraiment avoir des membres statiques qui permettent de garder des références à des objets managés
il suffit de créer une méthode pour éliminer les objets managés et de la "force" des consommateurs à utiliser à la sortie.
Par "force", je veux dire d'un document de votre classe avec un paragraphe qui stipule que "quand" et "pourquoi" pour utiliser cette "jeter" de la méthode.
Soit si vous êtes le seul consommateur (ou votre code...) ou que vous envisagez de distribuer votre classe.
Également essayer d'utiliser en quelque sorte un nom descriptif (pour que "jeter" de la méthode) comme "DisposeStatics", "AlwaysDispose", "DisposeAtEnd" etc.