如果一个类成员在C#中是KeepAlived,那么外部对象是否会被GC?

时间:2011-02-17 03:08:19

标签: .net garbage-collection

看到这堂课:

class Outer
{
    private Foo _foo;

    public Outer()
    {
        _foo = new Foo();
        GC.KeepAlive(_foo);
    }
}

如果我创建了一个类Outer的对象,该对象是否会被GC?

1 个答案:

答案 0 :(得分:3)

您确定您已正确理解KeepAlive的工作原理吗?

  

引用指定的对象,其中   使它不符合垃圾条件   从一开始就收集   目前的常规到了哪里   这个方法叫做。

因此,您要实例化Outer的实例。构造函数实例化_foo并立即调用KeepAliveKeepAlive调用确保在实例化_foo和调用KeepAlive之间的时间内未收集KeepAlive。只要_foo来电完成,Outer就有资格收集。

KeepAlive的实例 - 或任何其他类 - 一旦不再使用,就有资格收集。即使在理论上,对_foo的调用也是无关紧要的:它可能会使{em}稍微的{{1}}保持活着,但它对外层类没有任何影响。