1

我知道,由于某些版本StreamWriter停止支持终结器,但在源代码中我看到它调用GC.SuppressFinalize(this). 为什么叫它?我认为它实际上仅适用于具有终结器的对象。


更新

我想知道GC.SuppressFinalize()如果对象没有终结器是否有一些影响?

4

1 回答 1

4

它是dispose 模式的一部分。

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。)

于 2020-12-21T11:04:41.060 回答