2009-05-20 6 views
3

J'ai lu la réponse à la question Do event handlers stop garbage collection from occuring?, mais que se passe-t-il lorsque l'éditeur est la cible? Pour être plus précis, j'utilise la conception MVVM pour une application WPF. Les classes Model-View déclenchent un NotifyPropertyChanged à chaque modification. Dans certaines classes, j'ai besoin d'appeler une méthode quand quelque chose est modifié.Un événement géré automatiquement empêche-t-il l'instance d'être récupérée?

Je voudrais faire:

this.PropertyChanged += this.MyHandler; 

Est-ce que ce cas être détruits par le GC?

+0

Pourquoi ne pas simplement remplacer OnNotifyPropertyChanged? –

Répondre

8

Le GC regarde et voit si des références à l'objet sont actuellement enracinées dans l'application. Il est assez intelligent pour gérer des références circulaires comme celle ci-dessus.

En outre, il est assez intelligent pour gérer le cas où vous avez deux objets, A et B, et:

A.Event += B.Handler; 
B.Event += A.Handler; 

Si A et B à la fois hors de portée, le GC est assez intelligent pour trouver et nettoyer ces deux objets, même s'ils s'abonnent les uns aux autres. Cependant, si un objet distinct (en cours d'utilisation) fait référence à l'un ou à l'autre, cela empêchera les deux d'être collectés.

Ceci est l'un des principaux avantages d'une vraie solution GC, par rapport aux solutions de comptage de référence. Le comptage des références échouera à collecter ceci, mais le .NET gc le gérera parfaitement.

1

Oui, le GC est assez intelligent pour déterminer les références circulaires et collecter les objets impliqués. Il va même le gérer sur plusieurs objets si objectA écoute un événement sur objectB et objectB écoute un événement sur objectA à condition qu'ils soient tous les deux autrement référencés le GC se rendra compte qu'il peut les rassembler tous les deux .

(mieux que je peux trouver rapidement une référence est une autre question SO here)

2

Oui GC va nettoyer l'objet vers le haut car il n'y a rien à l'objet extérieur faisant référence. Le GC prend toutes les références tenues au niveau racine (champs statiques, références sur chaque pile de threads, etc.) et saute de ceux-ci aux objets qu'ils peuvent référencer, puis aux objets que ces objets peuvent référencer et ainsi de suite. Comme il va, il marque chaque objet comme "ne pas être collecté". Une fois qu'il a grignoté à travers eux, tout ce qui n'est pas encore marqué comme "ne pas être collecté" est disponible pour la collecte. Lorsque vous suivez cela, il n'y a aucun moyen pour le GC d'accéder à votre objet à partir de la racine et donc il sera collecté.

Questions connexes