Première - vous ne pouvez pas "tuer l'objet "A" explicitement"; vous pouvez effacer la référence, mais cela définit simplement une variable locale à null
et n'a rien à voir avec l'objet réel sur le tas géré. Vous pouvez Dispose()
il, mais c'est rien à voir avec GC.
Tout dépend; peut autre chose voir B
/C
? Sinon, ils sont éligibles pour la collecte. Mais GC est non-déterministe; ça n'arrive que quand ça le veut. À certains indéterminé temps, GC entrera, détecter que ces objets sont inaccessibles, et les supprimer. Dans le processus, il vérifiera ceux qui ont des finaliseurs (qui sont encore en suspens), et exécutera les finaliseurs (dans un processus en deux étapes).
Une chose que les gens oublient souvent en termes d'accessibilité sont les événements; si B
/C
s'abonner à des événements sur un objet de longue durée, alors B
/C
sont accessibles (par l'éditeur d'événement).
Pour clarifier; GC fonctionne en créant un arbre à partir des objets racine (threads, etc). Il marche chaque référence, signalant tous les objets qui peuvent être atteints. Tout ce qui n'est pas marqué à la fin est éligible pour la collecte. Cela évite le problème COM/COM + d'obtenir des fuites de mémoire dues à des îlots de données déconnectés, où X => Y et Y => X (donc X et Y ont tous deux des ref-positifs, donc aucun n'est effacé).
comment tuez-vous A? –