C# 如果存在来自另一个对象的对对象的引用,是否会对该对象进行垃圾回收?

C# 如果存在来自另一个对象的对对象的引用,是否会对该对象进行垃圾回收?,c#,garbage-collection,C#,Garbage Collection,,我想在C#的上下文中了解这一点 我有这样的课程: public class A { public List<string> AList { get; set; } } public class B { public List<string> BList { get; set; } } 我有两个问题: 是否将objectA垃圾收集?若有,原因为何?因为,在我看来,这些对象将在堆中创建,如下图所示: 我的第二个问题是下面的图像是否正确,关于如何在堆中分

,我想在C#的上下文中了解这一点

我有这样的课程:

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

public class B
{
    public List<string> BList { get; set; }
}
我有两个问题:

  • 是否将
    objectA
    垃圾收集?若有,原因为何?因为,在我看来,这些对象将在堆中创建,如下图所示:

  • 我的第二个问题是下面的图像是否正确,关于如何在堆中分配对象。我的意思是,
    objectA.AList
    是放在圆内(上图)还是放在圆附近(下图)


  • 是的,
    objectA
    引用的变量将被垃圾收集,或者至少可能被垃圾收集。再也没有什么可指了。(不能保证它会“很快”被收集,但它符合垃圾收集的条件。)

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


    第一个图表的问题在于一个对象“在”另一个对象中。这不是它的工作原理-一个对象只是维护对另一个对象的引用,但每个对象实际上是一个独立的内存块。。。如果某个特定对象没有任何引用,它就有资格被垃圾收集。

    因此我不确定这个答案,所以希望有更好理解的人能够回答,但据我所知,没有任何引用的对象最终应该被垃圾收集,不需要别的了。为了不被垃圾收集,对象最终需要活动范围(在引用链的上游)到当前正在执行的程序。一旦它消失了,无论何时运行,对收藏家来说都是公平的游戏。这需要2分钟来检查。但是逻辑在我的头脑中表明,是的,因为objectB.Alist包含了对Alist的引用,所以如果Alist被改变,那么objectB.Alist的结果就是Alist。所以如果Alist等于null,objectB.Alist也一样。所以Alist的内容是GC'ed,但是对象Alist不是,它现在是null@HenkHolterman请看我独特的问题谢谢你的回答!如果我在
    objectA
    中创建新字段
    int k
    ,那么
    k
    将被放置在堆中的某个位置,而不是
    objectA
    中,这是对的吗?@steppup:No,
    k
    将是
    objectA
    的一部分,就像字段backing
    AList
    是-但是字段backing
    AList
    的值只是一个引用,它不是列表对象。这本书也许值得你一读
    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