如果我引用超出范围的对象的对象属性是有资格进行垃圾回收的外部对象
本文关键字:对象 外部 有资格 属性 引用 如果 范围 | 更新日期: 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 以某种方式记住了largeThing
和SmallThing
之间的原始关联? (您可以假设SmallThing
不包含对程序员创建的largeThing
的显式向后引用)。
你是对的,largeThing
一旦你通过这条线就可以收集
SmallThing = largeThing.SmallThing;
它甚至不需要等待MyMethod
返回即可收集它(这假设在没有附加调试器的情况下运行发布模式)。一旦largeThing
的最后一次使用通过,它就有资格收集。
由于没有对largeThing
的活动引用,因此它有资格进行垃圾回收。 没有来自SmallThing
的"隐藏"或隐式引用会阻止它符合资格。