如果我引用超出范围的对象的对象属性是有资格进行垃圾回收的外部对象

本文关键字:对象 外部 有资格 属性 引用 如果 范围 | 更新日期: 2023-09-27 18:33:32

在下面的代码中:

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的显式向后引用)。

如果我引用超出范围的对象的对象属性是有资格进行垃圾回收的外部对象

你是对的,largeThing一旦你通过这条线就可以收集

SmallThing = largeThing.SmallThing;

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

由于没有对largeThing的活动引用,因此它有资格进行垃圾回收。 没有来自SmallThing的"隐藏"或隐式引用会阻止它符合资格。