在C#中,当我有两个对象 obj1 , obj2 由List<string>
组成时,我将这两个对象分配给同一个{{1}对象。
如果我对obj1的引用超出范围但我对obj2的引用没有,obj1是否仍然有资格进行垃圾回收,或者是否存在一些依赖性问题,因为仍然存在对List<string>
对象的引用? / p>
答案 0 :(得分:3)
在您的情况下,obj1
必须符合条件 才能进行垃圾回收。
您需要在此处查看Jon Skeet's
answer
。它清楚地解释了垃圾收集如何在对象引用上工作。
Object's Lifetime in C#
上的一个很好的教程。
答案 1 :(得分:1)
obj1就有资格进行垃圾收集。
答案 2 :(得分:1)
如果我对obj1的引用消失了 范围,但我对obj2的引用确实如此 不,obj1仍然有资格获得 垃圾收集,还是有一些 依赖性问题,因为有 仍然是对列表的引用 对象
如果我理解正确,则表示obj1
和obj2
都属于List<string>
类型,并且都指向相同 List<string>
实例。
当obj1
超出范围时,仍然会有obj2
作为List<string>
实例的有效引用,因此列表不能被垃圾回收。
如果obj1是堆上的引用类型(即其属性之一)的一部分,则它占用的内存空间可能被垃圾收集为外部对象的一部分。如果它只是堆栈上的引用,则不会涉及GC,因为当obj1超出范围时,堆栈将在方法调用结束时解除。
请记住,obj1只是堆上对象的引用(以某种方式指针) - 只有当没有引用指向它时,此对象才可能被垃圾收集。
答案 3 :(得分:0)
此问题中定义了三种内存用途:
List<string>
的{{1}}实例的指针。obj1
的{{1}}实例的指针。List<string>
。如果obj2
超出范围,但List<string>
没有,那么垃圾收集后只剩下以下内容:
obj1
的{{1}}实例的指针。obj2
。重要的是要记住C#在大多数情况下抽象出指针的概念,以便您可以安全地将List<string>
和obj2
视为List<string>
而不是指针,而是指针他们是。
答案 4 :(得分:-1)
如果obj1
是List的成员,则在父列表被垃圾回收之前,它不可用于垃圾回收。
所以:
List<string> l = new List<string>();
string a = "one";
l.Add(a);
{
string b = "two";
l.Add(b);
}
在此列表的末尾,a
在范围内,b
超出范围,但两者仍在列表l
中有引用,因此两者都不符合垃圾回收的条件