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 不工作呢?
尝试一下,您会发现您的代码在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();
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)