Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将一个对象与另一个对象关联以进行GC清理_C#_.net_Garbage Collection - Fatal编程技术网

C# 将一个对象与另一个对象关联以进行GC清理

C# 将一个对象与另一个对象关联以进行GC清理,c#,.net,garbage-collection,C#,.net,Garbage Collection,是否有任何方法可以将一个对象实例(对象A)与另一个对象(对象B)以通用方式关联起来,这样当B被收集时,A就可以被收集了?如果B有一个指向A的实例变量,但没有显式地更改B的类定义,并且能够以动态方式这样做,那么会发生相同的行为吗 同样的效果也可以通过使用Component.Disposed事件来实现,但我不想让B成为一次性的 编辑 我基本上是创建一个与单个“根”对象关联的对象的缓存,我不希望缓存是静态的,因为可能有很多根对象使用不同的缓存,所以当根对象不再使用但缓存的对象仍然存在时,大量内存将被耗

是否有任何方法可以将一个对象实例(对象A)与另一个对象(对象B)以通用方式关联起来,这样当B被收集时,A就可以被收集了?如果B有一个指向A的实例变量,但没有显式地更改B的类定义,并且能够以动态方式这样做,那么会发生相同的行为吗

同样的效果也可以通过使用Component.Disposed事件来实现,但我不想让B成为一次性的

编辑

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


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

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

公共类相关引用
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;
    }
}
{ 私人A; 私人B,; 公共B参照物 { 获取{return b;} } 公共关系参考(A、B) { 这个a=a; 这个.b=b; } }
然后,只要在每个使用B的地方使用RelatedReference,如下所示:

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

您能更详细地解释一下这有什么帮助吗?如果另一个对象引用了B,B仍然不会被收集。是的,您必须小心不要设置任何其他对B的引用。我也同意WeakReference类可能是一种方法。@thecoop-您实际上是通过一个通用包装器对象访问所有内容。收集包装器对象后,将收集其所有引用。您必须小心,不要将Referent属性分配给任何其他变量,尽管此解决方案有点脆弱。。。如果我理解正确的话,这里有一个设计缺陷。如果缓存A中有对象B,而对象Z引用了对象B,你是说当A消失时,你也希望B消失?对象Z对B的引用会发生什么情况?根对象之外不会有对缓存对象的引用。如果有,我希望正常的CLR强引用确保它没有被收集:)如果A只有对B的引用,然后,当A被收集时,B自动成为有资格收集的对象,因为不再有对B的任何引用。我想添加这个引用,而不在类定义中显式地使用变量。类似于线程本地存储,但在对象上而不是在线程上完成。所以你们是说你们不希望a有一个缓存对象的集合,或者B有一个父变量?这是什么原因?我认为这是不可能的,因为你没有提到B,所以它会被清理。您可以创建链接a和B的第三个对象,但现在您有了更多的引用。您还需要一种定期清理引用的方法,这样可以终止自动收集。