189 votes

Les gestionnaires d'événement empêchent-ils la récupération de place?

Si j'ai le code suivant:

 MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;
 

Est-ce que pClass sera récupéré? Ou va-t-il traîner encore ses événements chaque fois qu'ils se produisent? Dois-je effectuer les opérations suivantes pour autoriser la récupération de place?

 MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;
 

220voto

Marc Gravell Points 482669

Pour la question spécifique "Sera pClass être nettoyés": le cas de l'abonnement n'a pas d'effet sur la collection de pClass (éditeur).

Pour le GC en général (en particulier, la cible): cela dépend si MyFunction est statique ou en fonction d'instance.

Un délégué (comme un événement d'abonnement) à une méthode d'instance comprend une référence à l'instance. Donc oui, un abonnement d'événement permettra d'éviter GC. Cependant, dès que l'objet de la publication de l'événement (pClass ci-dessus) est admissible pour la collecte, cela cesse d'être un problème.

Notez que c'est un moyen; c'est à dire si nous avons:

publisher.SomeEvent += target.SomeHandler;

puis "éditeur" gardera "cible" en vie, mais "cible" ne gardez pas "éditeur" en vie.

Donc pas: si pClass va être recueillies de toute façon, il n'est pas nécessaire pour vous désinscrire les auditeurs. Toutefois, si pClass était longue durée de vie (plus que l'instance avec MyFunction), puis pClass pourrait garder cette instance en vie, il serait nécessaire de vous désabonner si vous voulez la cible à être collectées.

Les événements statiques, cependant, pour cette raison, sont très dangereux lorsqu'il est utilisé avec fonction d'instance de gestionnaires.

9voto

Tor Haugen Points 8258

Oui, pClass sera collecté. L'abonnement à l'événement n'implique pas qu'il existe une référence à pClass.

Donc non, vous n'aurez pas à détacher le gestionnaire pour que pClass soit récupéré.

8voto

lvaneenoo Points 169

Au moment où un morceau de mémoire n'est plus référencé, il devient candidat à la récupération de place. 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 n'êtes pas certain que quelque chose sera collecté, posez-vous la question suivante: existe-t-il toujours une référence à cette question? Les gestionnaires d'événements sont référencés par l'instance d'objet, et non l'inverse.

0voto

Arav Points 1

pClass seront collectés. Toutefois, 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 pas pClass sur null .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X