将对象与另一个对象关联以进行GC清除

时间:2010-03-23 13:58:03

标签: c# .net garbage-collection

有没有办法以一般方式将对象实例(对象A)与第二个对象(对象B)相关联,这样当收集B时,A变得可以收集?如果B有一个指向A的实例变量,但没有明确地改变B的类定义,并且能够以动态方式执行此操作,则会发生相同的行为吗?

通过以时髦的方式使用Component.Disposed事件可以完成同样的效果,但我不想让B一次性使用

修改

我基本上是创建一个与单个“root”对象关联的对象缓存,我不希望缓存是静态的,因为可能有很多根对象使用不同的缓存,所以很多当不再使用根对象但仍然存在高速缓存的对象时,内存将被用完。

因此,我希望将一组缓存对象与每个“根”对象相关联,而不更改根对象定义。类似于附加到每个根对象实例的额外对象引用的元数据。这样,收集根对象时会收集每个集合,而不会像使用静态缓存时那样挂起。

2 个答案:

答案 0 :(得分:1)

简短回答:可能不是。你能解释一下你想要做的更多吗? WeakReference可能是您所需要的。

答案 1 :(得分: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;
    }
}

然后在每个使用B的地方使用RelatedReference:

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