如果从另一个对象引用它,将会收集一个对象垃圾吗?

时间:2016-05-17 16:08:49

标签: c# garbage-collection

It is not a duplicate,我想在C#的背景下了解这一点。

我有这样的课程:

public class A
{
    public List<string> AList { get; set; }
}

public class B
{
    public List<string> BList { get; set; }
}

想象一下,在row 6中发生垃圾收集:

1 row: A objectA = new A();
2 row: B objectB = new B();

3 row: objectA.AList = new List<string>() { "1", "2", "3" };
4 row: objectB.BList = objectA.AList;

5 row: objectA = null;
6 row: //Garbage collection occurs

我有两个问题:

  1. 会收集objectA垃圾吗?如果是,为什么?因为,在我看来,这些对象将在堆中创建,如下图所示:enter image description here

  2. 我的第二个问题是关于如何在堆中分配对象,以下图像是否正确。我的意思是,objectA.AList放在一个圆圈内(上图)或靠近圆圈(下图)

  3. enter image description here

1 个答案:

答案 0 :(得分:5)

是的,objectA引用的变量将 - 或者至少可能被垃圾收集。那里没有没有引用它了。 (不保证会收集&#34;很快&#34;,但它符合条件进行垃圾收集。)

objectA.AList引用的列表不会被垃圾收集,因为objectB.BList现在引用它。

第一个图表的问题是一个对象是&#34;内部&#34;另一个。这不是它的工作原理 - 一个对象只是维护一个引用到另一个对象,但每个对象实际上是一个独立的内存...如果没有任何引用从某个特定的对象,它有资格进行垃圾收集。