2010-03-23 5 views
4

Existe-t-il un moyen d'associer de manière généralisée une instance d'objet (objet A) à un second objet (objet B), de sorte que lorsque B est collecté, A devient éligible à la collecte? Le même comportement qui se produirait si B avait une variable d'instance pointant vers A, mais sans changer explicitement la définition de classe de B, et être capable de le faire de manière dynamique?Association d'un objet à un autre objet pour la correction GC

Le même genre d'effet pourrait être fait en utilisant l'événement Component.Disposed de manière génial, mais je ne veux pas faire usage unique B

EDIT

Je crée essentiellement un cache d'objets associés à un seul objet 'root', et je ne veux pas que le cache soit statique, car il peut y avoir beaucoup d'objets racine utilisant des caches différents, donc beaucoup de mémoire sera utilisée quand une racine l'objet n'est plus utilisé mais les objets mis en cache sont toujours présents. Donc, je veux qu'une collection d'objets en cache soit associée à chaque objet 'root', sans changer la définition de l'objet racine. Tri de métadonnées similaires d'une référence d'objet supplémentaire attachée à chaque instance d'objet racine. De cette façon, chaque collection sera collectée lorsque l'objet racine est collecté, et ne restera pas comme si un cache statique était utilisé.

+0

Si je comprends bien, il y a un défaut de conception ici. Donc, si vous avez le cache A avec l'objet B, et que l'objet Z fait référence à l'objet B, vous dites que lorsque A disparaît, vous voulez que B disparaisse aussi? Qu'est-ce qui est censé arriver à la référence de Z à B? –

+0

Il n'y aura pas de références aux objets mis en cache en dehors de l'objet racine. Et s'il y en avait, je voudrais que les références CLR normales soient vérifiées pour s'assurer qu'elles ne sont pas collectées :) – thecoop

+0

Si le A a la seule référence à B, alors B devient automatiquement éligible pour la collecte quand A est collecté car il n'y aura plus être des références à B. –

Répondre

1

Réponse courte: Probablement pas. Pouvez-vous expliquer plus de ce que vous essayez de faire? Il y a une chance que WeakReference soit ce dont vous avez besoin.

1
public class RelatedReference<A, B> 
{ 
    private A a; 
    private B b; 

    public B Referent 
    { 
     get {return b;} 
    } 

    public RelatedReference(A a, B b) 
    { 
     this.a = a; 
     this.b = b; 
    } 
} 

Ensuite, il suffit d'utiliser RelatedReference tous où vous utiliseriez B comme ceci:

var Bref = new RelatedReference<A, B>(new A(), new B()); 
    Bref.Referent.Foo(); 
+0

Pourriez-vous expliquer plus en détail comment cela aide? – thecoop

+0

Si un autre objet a une référence à B, B ne sera toujours pas collecté. –

+0

Oui, vous devez faire attention à ne pas définir d'autres références à B. Je suis également d'accord avec le fait que la classe WeakReference pourrait être le chemin à parcourir. –

Questions connexes