Si j'ai le code suivant:
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;
PClass sera-t-il ramassé? Ou restera-t-il toujours en train de déclencher ses événements chaque fois qu'ils se produisent? Dois-je effectuer les opérations suivantes pour autoriser le garbage collection?
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;
c#
.net
event-handling
garbage-collection
Mark Ingram
la source
la source
Réponses:
Pour la question spécifique "Est-ce que pClass sera garbage collection": l'abonnement aux événements n'a aucun effet sur la collection de pClass (en tant qu'éditeur).
Pour GC en général (en particulier, la cible): cela dépend si MyFunction est statique ou basé sur une instance.
Un délégué (tel qu'un abonnement à un événement) à une méthode d'instance inclut une référence à l'instance. Alors oui, un abonnement à un événement empêchera GC. Cependant, dès que l'objet publiant l'événement (pClass ci-dessus) est éligible pour la collecte, cela cesse d'être un problème.
Notez que c'est unidirectionnel; c'est à dire si nous avons:
alors «éditeur» gardera «cible» en vie, mais «cible» ne maintiendra pas «éditeur» en vie.
Donc non: si pClass doit quand même être collecté, il n'est pas nécessaire de désinscrire les écouteurs. Cependant, si pClass avait une longue durée de vie (plus longue que l'instance avec MyFunction), alors pClass pourrait garder cette instance vivante, il serait donc nécessaire de se désabonner si vous voulez que la cible soit collectée.
Cependant, pour cette raison, les événements statiques sont très dangereux lorsqu'ils sont utilisés avec des gestionnaires basés sur des instances.
la source
WeakReference
pourrait être une bonne idée, et dans certains cas, mais aussi souvent que non, ce sera une bonne idée.Oui, pClass sera ramassé. L'abonnement aux événements n'implique aucune référence à pClass.
Si non, vous n'aurez pas à détacher le gestionnaire pour que pClass soit ramassé.
la source
Dès qu'un morceau de mémoire n'est plus référencé, il devient un candidat pour le garbage collection. Lorsque l'instance de votre classe est hors de portée, elle n'est plus référencée par votre programme. Il n'est plus utilisé et peut donc être collecté en toute sécurité.
Si vous ne savez pas si quelque chose sera collecté, posez-vous la question suivante: existe-t-il encore une référence? Les gestionnaires d'événements sont référencés par l'instance d'objet, et non l'inverse.
la source
pClass
seront ramassés. Cependant, si l'extrait de code ci-dessus se trouve dans une autre classe, l'instance de cette classe peut ne pas être effacée si vous ne définissez paspClass
surnull
.la source