2010-03-23 40 views
4

是否有任何方式以广义方式将对象实例(对象A)与第二个对象(对象B)关联起来,以便在B收集时A成为可收集的对象?如果B有一个指向A的实例变量,但没有明确地改变B的类定义,并且能够以动态的方式做到这一点,那么会发生同样的行为?将对象与另一个对象关联以进行GC清除

同一类的效果可以通过在一个时髦的方式使用Component.Disposed事件中完成,但我不希望使得B一次性

编辑

我基本上创造与单个“根”对象关联的对象缓存,而且我不希望缓存为静态,因为可能会有很多使用不同缓存的根对象,因此大量内存将用于根对象不再使用,但缓存的对象仍在周围。

所以,我想要一个缓存对象的集合与每个'根'对象关联,而不需要改变根对象的定义。附加到每个根对象实例的附加对象引用的类似元数据的排序。这样,当收集根对象时,每个集合都会被收集起来,而不会像使用静态缓存时一样回收。

+0

如果我理解正确的这个,有一个设计缺陷在这里。所以如果你的缓存A中有对象B,并且对象Z有对象B的引用,那么你说A何时离开,你还想让B也离开?对象Z对B的引用应该发生什么? – 2010-03-23 14:18:43

+0

不会有对根对象以外的缓存对象的引用。如果有的话,我会希望正常的CLR强烈的引用来确保它不被收集:) – thecoop 2010-03-23 14:24:36

+0

如果A只有B的引用,那么当A被收集时,B自动变为有资格收集,因为不会再有是任何对B的引用。 – 2010-03-23 14:27:15

回答

1

简答:可能不是。你能解释一下你想做什么吗? WeakReference有可能是你需要的。

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; 
    } 
} 

就用RelatedReference每一个地方,你会用b类似这样:

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

你能否更详细地解释这有何帮助? – thecoop 2010-03-23 14:15:52

+0

如果另一个对象有一个对B的引用,B仍然不会被收集。 – 2010-03-23 14:16:03

+0

是的,你必须小心不要设置任何其他引用B.我也同意WeakReference类可能是要走的路。 – 2010-03-23 14:23:40

相关问题