【发布时间】:2020-12-05 21:42:17
【问题描述】:
我想我缺少一些基本的东西,希望你能提供帮助。下面的代码创建一个对象,删除引用并调用垃圾收集器。我的期望是 SomeClass 的终结器会在站在 Readline 时被调用。它没有。我尝试在循环中调用 GC.Collect,添加一些 Sleep() 调用以启动终结器线程。不会发生。
只有在 Main 结束时才会击中终结器,但令人惊讶的是它会被击中两次。我错过了什么?
class Program
{
public static void Main(string[] args)
{
SomeClass some = new SomeClass("Hello World!");
some = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("Done");
Console.ReadLine();
}
}
class SomeClass
{
string ss;
public SomeClass(string s) { ss = s; }
~SomeClass()
{
var hash = this.GetHashCode();
}
}
附录
在调试模式和发布模式下运行程序是有区别的。下面的程序在调试模式下生成Start - Done - Finalize,而在发布模式下,日志文件显示Start - Finalize - Done。后者是我所期望的。
class Program
{
private static string logfile = @"c:\temp\log.txt";
public static void Main(string[] args)
{
File.WriteAllText(logfile, "Start\n");
SomeClass some = new SomeClass("Hello World!");
some = null;
GC.Collect();
GC.WaitForPendingFinalizers();
File.AppendAllText(logfile, "Done\n");
}
}
class SomeClass
{
private static string logfile = @"c:\temp\log.txt";
public string SomeString { get; set; }
public SomeClass(string s) { SomeString = s; }
~SomeClass()
{
File.AppendAllText(logfile, "Finalize\n");
}
}
【问题讨论】: