问题描述
我知道由于某个版本 StreamWriter
停止支持 Finalizer,但在 source code 中我看到它调用 GC.SuppressFinalize(this)
。为什么叫它?我以为它实际上只适用于具有 Finalizer 的对象。
更新
我想知道如果对象没有 Finalizer,GC.SuppressFinalize()
是否有一些影响?
解决方法
它是 dispose pattern 的一部分。
Microsoft 将配置模式描述为:
public void Dispose()
{
// Dispose of unmanaged resources.
Dispose(true);
// Suppress finalization.
GC.SuppressFinalize(this);
}
引用链接:
Dispose
方法执行所有对象清理,因此垃圾收集器不再需要调用对象的 Object.Finalize
覆盖。因此,调用 SuppressFinalize
方法会阻止垃圾收集器运行终结器。如果类型没有终结器,则对 GC.SuppressFinalize
的调用无效。请注意,实际清理是由 Dispose(bool)
方法重载执行的。
编辑:
进一步看,关于 DRY,我会StreamWriter.Close()
只是调用 StreamWrite.Dispose()
。此外,无论如何,StreamWriter.Close()
似乎是多余的,因为基类 TextWriter.Close()
具有相同的内容! (那个应该直接调用 TextWrite.Dispose()
。
但这只是 MHO。)