垃圾收集不起作用 int .net c#

ILo*_*zza 3 .net c# garbage-collection

我正在使用此代码作为示例:

var p = new person("Amir");
var zp = new person("Amiraa");
GC.Collect();
GC.WaitForPendingFinalizers();

class person
{
    public person(string nName)
    {
        Console.WriteLine("New");
        string name = nName;
    }

    ~person()
    {
        Console.WriteLine("Garbage collected");
    }
}
Run Code Online (Sandbox Code Playgroud)

但控制台上的结果只显示“新建”,而不显示“垃圾收集”。那么为什么 gc 不工作呢?

can*_*on7 6

尝试一下,您会发现您的代码在Release中按预期工作,但不一定在Debug 中工作。

这是因为变量pzp仍然在您调用时的范围内GC.Collect()。他们仍然引用person实例。

在Release中,GC会很乐意收集仍在作用域内的变量引用的对象,只要它们不再被使用。在 Debug 中,调试器需要让您查看作用域内所有变量的内容,因此 GC 无法收集它们。

如果你这样做:

var p = new person("Amir");
var zp = new person("Amiraa");

p = null;
zp = null;

GC.Collect();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)

即使在调试中,您也会看到预期的输出。请注意,.NET 6 中引入的分层编译会影响这一点,并且上述测试可能无法按预期工作。

如果引入单独的方法,因此p和的生命周期被显式限定,即使在.NET 6 上,您也应该在 Debug 中zp看到预期的行为:

Test();
GC.Collect();
GC.WaitForPendingFinalizers();

void Test()
{
    var p = new person("Amir");
    var zp = new person("Amiraa");
}
Run Code Online (Sandbox Code Playgroud)