如果我引用超出范围的对象的对象属性,外部对象是否有资格被垃圾收集?

时间:2014-12-08 23:19:54

标签: c# .net garbage-collection

在以下代码中:

public class MyClass
{

    public SmallObject SmallThing { get; set; }

    private void MyMethod()
    {
        var largeThing = new LargeObject();
        SmallThing = largeThing.SmallThing;
    }

}
执行MyMethod()

我引用SmallThing但没有引用largeThing。 Dot Net是否能够识别largeThing有资格被收集,而它所包含的SmallObject实例不合格?或者Dot Net是否记得largeThingSmallThing之间的原始关联? (您可以假设SmallThing 包含对程序员创建的largeThing的显式后向引用。

2 个答案:

答案 0 :(得分:1)

由于没有对largeThing的有效引用,因此它有资格进行垃圾回收。没有"隐藏"或来自SmallThing的隐式引用,以防止其符合条件。

答案 1 :(得分:1)

你是对的,largeThing一旦你通过

就可以收集
SmallThing = largeThing.SmallThing;

它甚至不需要等待MyMethod返回它才能收集它(这假定在没有附加调试器的情况下运行释放模式)。一旦largeThing的最后一次使用通过,它就有资格收集。

相关问题