在这个答案中我发现,
当您的代码中使用了 Dispose/Finalize 模式时,清理 Finalize 方法中的非托管资源和 Dispose 方法中的托管资源。
后来我发现了这篇关于 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。当对象被垃圾回收时,即使开发人员忽略显式调用 Dispose 方法,Finalize 实现仍将运行并且资源仍将被释放。Francesco Balena 在他的博客中写道:“仅当您的类型调用分配非托管资源(包括非托管内存)的非托管代码并返回您最终必须使用以释放资源的句柄时,才应使用 Dispose/Finalize 模式。dispose 和 finalize 都必须在它们处理或完成自己的成员后,通过调用其父对象各自的方法链接到它们的父对象”。 简单地说,当您的代码中使用了 Dispose/Finalize 模式时,清理 Finalize 方法中的非托管资源和 Dispose 方法中的托管资源。
现在我又困惑了。在整篇文章和代码示例中,都表明应该在Dispose()
. 但是,那条评论的相关性是什么?
编辑:
经证实,这条线:
简而言之,当您的代码中使用了 Dispose/Finalize 模式时,清理 Finalize 方法中的非托管资源和 Dispose 方法中的托管资源
是错误的,我编辑了这个答案。