C# 对象何时进行垃圾收集?

C# 对象何时进行垃圾收集?,c#,garbage-collection,C#,Garbage Collection,在c#中,当没有对对象的引用时,对象将接受垃圾收集。假设是这样的话,会不会收集到以下任何一项,或者垃圾收集器是否足够聪明,可以同时丢弃这两项 class Program { static void Main() { A a = new A(); a.b = new B(); a.b.a = a; a = null; } { class A { public B b; } class B {

在c#中,当没有对对象的引用时,对象将接受垃圾收集。假设是这样的话,会不会收集到以下任何一项,或者垃圾收集器是否足够聪明,可以同时丢弃这两项

class Program
{
    static void Main()
    {
        A a = new A();
        a.b = new B();
        a.b.a = a;
        a = null;
    }

{

class A
{
    public B b;
}

class B
{
    public A a;
}

一旦不再需要它们,它们都将有资格被收集。这意味着在某些情况下,甚至可以在定义对象的范围结束之前收集对象。另一方面,实际收集也可能发生得更晚

.NET垃圾回收器不基于引用计数,因此循环依赖关系没有区别

它基于算法,该算法将所有对象视为收集的候选对象,然后从可用根(局部变量、静态变量)遍历对象图,将它们标记为“仍然活动”。那些没有被标记为仍在使用的,将被收集。请注意,这是一个稍微简化的描述:.NET中的实际算法采用标记和扫描,托管堆分为3代+大对象堆,完全忽略终结,等等

我建议你查一下更多的信息