我正在读书this前几天的文章,我想知道为什么有 Finalizer 和 Dispose 方法。我读here关于为什么您可能想要将 Dispose 添加到 Finalizer 中。我好奇的是,什么时候 Finalizer 会通过 Dispose 方法本身被调用?是否有代码示例,或者它是基于软件运行的系统上发生的事情?如果是这样,GC 不运行 Dispose 方法会发生什么情况。
这里终结器的目的只是为了防止内存泄漏(如果发生not打电话Dispose
明确)。这也意味着如果您希望对象在程序关闭时释放资源,则不必处置对象,因为 GC 无论如何都会被迫完成并收集所有对象。
与此相关的是,在处理对象时,与终结器略有不同非常重要。
~MyClass()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected void Dispose(disposing)
{
if (!this.disposed)
{
if (disposing)
{
// Dispose managed resources here.
}
// Dispose unmanaged resources here.
}
this.disposed = true;
}
原因是你do not想要在终结器中处置托管资源的一个问题是,您实际上会在这样做时创建对它们的强引用,这可能会阻止 GC 正确完成其工作并收集它们。当然,非托管资源(例如 Win32 句柄等)应始终显式关闭/处置,因为 CLR 不了解它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)