作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个带有析构函数方法的空白 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());
}
}
当表单被销毁时,我希望它写入输出窗口:
(Form1 opened)Form1.Initialize 41149443(Form1 closed)Form1.Dispose 41149443
MSDN 建议了 3 种实现析构函数的方法:
~析构函数() http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx
IDisposable http://msdn.microsoft.com/en-us/library/system.idisposable.aspx
安全句柄模式 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safehandle.aspx
但是,这些方法都没有将“Form1.Dispose 41149443”写入输出窗口。因此,我无法判断表格是否已被破坏。建议?
由于垃圾收集器的不确定性,我是否应该放弃实现这一目标的希望?
有没有其他方法可以知道 Form1 是否已被垃圾回收?
最佳答案
您列出的实现析构函数的三种方法中只有一种实际上涉及析构函数,即 ~Destructor()
。
如果您实现了 IDisposable
并释放了您的对象,那么 Dispose
中的代码将会运行,但没有理由认为您的析构函数会运行。
我认为你在这里追逐不可能。析构函数按照垃圾收集器的指示运行。这不是你能控制的。 GC 完全有权形成运行析构函数只是浪费时间的观点,如果有足够的内存,它就会形成这种观点。
如果您需要可预测的处置、终结等,请使用 IDisposable
。
关于c# - 为什么我的析构函数从不运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6931305/
我是一名优秀的程序员,十分优秀!