我以这段代码为例:
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");
}
}
但是控制台上的结果只显示“New”,而不是“Garbage collected”。那么为什么 gc 不工作?
最佳答案
试一试,您会发现您的代码在 Release 中按预期工作, 但不一定 Debug .
这是因为变量 p
和 zp
在您调用 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();
你会看到 the output you expect ,即使在调试中。请注意,.NET 6 中引入的分层编译会影响这一点,并且上述测试可能无法按预期进行。
如果你引入一个单独的方法,那么 p
和 zp
的生命周期被显式限定,你应该甚至在 .NET 6 in Debug 上看到预期的行为。 :
Test();
GC.Collect();
GC.WaitForPendingFinalizers();
void Test()
{
var p = new person("Amir");
var zp = new person("Amiraa");
}
关于c# - 垃圾收集不工作 int .net c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70678955/