【发布时间】:2013-05-12 04:50:46
【问题描述】:
在this answer我找到了,
清理 Finalize 方法中的非托管资源和 Dispose 方法中的托管对象,当 Dispose/Finalize 模式时 已在您的代码中使用。
后来我发现 this nice article 关于 finalize 和 dispose 并对它们有了一个清晰的认识。文章有如下代码(第3页),解释概念:
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
// Code to dispose the managed resources of the class
}
// Code to dispose the un-managed resources of the class
isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
但在此之下,会出现相同的注释(我在此问题的开头包含)。
Dispose/Finalize 模式 Microsoft 建议您在使用非托管资源时同时实现 Dispose 和 Finalize。那么正确的顺序将 供开发人员调用 Dispose。 Finalize 实施将 运行并且当对象被释放时资源仍然会被释放 即使开发人员忽略调用 Dispose 也会收集垃圾 明确的方法。 Francesco Balena 在他的博客中写道“ 仅当您的类型调用时才应使用 Dispose/Finalize 模式 分配非托管资源的非托管代码(包括非托管 memory) 并返回一个句柄,您最终必须使用它来释放 资源。 dispose 和 finalize 都必须链接到它们的父级 对象通过调用其父对象各自的方法 处置或确定了自己的成员”。 简单来说就是在 Finalize 方法中清理非托管资源,在 Dispose 方法中清理托管资源,当 您的代码中使用了 Dispose/Finalize 模式。
现在我又糊涂了。在整篇文章和代码示例中,都表明应该在Dispose() 中释放非托管资源。但是那条评论的相关性是什么?
编辑:
由于已确认这一行:
简单地说,在 Finalize 方法中清理非托管资源并 Dispose 方法中的托管对象,当 Dispose/Finalize 模式已在您的代码中使用
是错误的,我编辑了this answer。
【问题讨论】: