为什么我的析构函数永远不会运行?

Jes*_*aya 14 c# garbage-collection winforms

我有一个带有析构函数方法的空白Winform

public partial class Form1 : Form
{
    public Form1()
    {
        System.Diagnostics.Trace.WriteLine("Form1.Initialize " + this.GetHashCode().ToString());
        InitializeComponent();
    }
    ~Form1()
    {
        System.Diagnostics.Trace.WriteLine("Form1.Dispose " + this.GetHashCode().ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

当表单被销毁时,我希望它写入输出窗口:

(Form1 opened)
Form1.Initialize 41149443
(Form1 closed)
Form1.Dispose 41149443

MSDN建议实现析构函数的3种方法:

但是,这些方法都不会将"Form1.Dispose 41149443"写入输出窗口.因此,我无法判断表格是否已被销毁.建议?

由于垃圾收集器的不确定性,我是否应该放弃实现这一目标的希望?

还有另一种方法可以知道Form1是否被垃圾收集?

Dav*_*nan 10

实现你列出的析构函数的三种方法中只有一种实际上涉及析构函数,就是这样~Destructor().

如果你实现IDisposable并处理你的对象,那么代码Dispose将运行,但是没有理由认为你的析构函数会.

我想你在这里追逐不可能的事情.析构函数在垃圾收集器如此规定时运行.这不是你可以控制的东西.GC完全有权形成这样的观点,即运行析构函数只会浪费时间,如果有足够的内存,它将形成这种观点.

如果您需要可预测的处理,定稿等,请使用IDisposable.

  • @slfan你在说什么?Dispose在被调用时运行,总是通过using来运行。我在哪里说`Dispose`会自动运行? (2认同)
  • 是的,它也不会调用终结器!这就是为什么我不称之为可预测的处置方式.它只是使用非托管资源的标准模式,任何具有终结器的类都应该实现IDisposable模式.但在我看来,这个答案并不是对上述问题的回答. (2认同)