【问题标题】:Does GC.SuppressFinalize() have effect if the object has not Finalizer? [duplicate]如果对象没有终结器,GC.SuppressFinalize() 是否有效? [复制]
【发布时间】:2020-12-21 11:03:02
【问题描述】:

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


更新

我想知道如果对象没有Finalizer,GC.SuppressFinalize()是否有一些效果?

【问题讨论】:

标签: c# dispose finalizer suppressfinalize


【解决方案1】:

它是dispose pattern 的一部分。

Microsoft 将 dispose 模式描述为:

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

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多