【问题标题】:Why use GC.SuppressFinalize() when there is no Finalizer?为什么在没有 Finalizer 的情况下使用 GC.SuppressFinalize()?
【发布时间】:2013-09-29 13:25:09
【问题描述】:

正如问题所述,我只是想知道,因为有人问过我,但我不知道,这有什么原因吗?

【问题讨论】:

    标签: c# .net garbage-collection dispose idisposable


    【解决方案1】:

    当一个类没有定义终结器(析构函数)时,对该类has no effect 的实例调用SuppressFinalize()

    当您看到它时,它通常是完整的 Disposable 实现的遗留物。只需删除它或忽略它。

    【讨论】:

    • 如果一个类没有终结器,GC.SuppressFinalize() 等价于GC.KeepAlive()。因此,它不仅会禁止类自己的终结器运行,而且会确保它持有引用的任何对象的终结器在处置完成之前不会被调度执行。如果对象在没有处置的情况下被放弃,它不会防止终结器“提前”运行,但会在对象被正确处置的情况下防止其拥有的对象过早终结。
    • @supercat 你是说如果对象图中的任何东西都无法处理或完成,那么整个图将保留内存?
    • @Sinaesthetic:当一个符合终结条件的对象除了有资格终结的对象的特殊列表之外没有对其的引用时,它“有资格终结”标志被清除,但它是移动到一个根深蒂固的对象列表,这些对象应该尽早完成。就在启动终结器之前,该对象将从后一个列表中删除,因此如果没有创建对该对象的其他引用,它将有资格在下一个循环中收集。
    • @supercat - 您在此处的最高评论可能与对某些来源的引用有关。我就是不明白。
    • @HenkHolterman:除非任何正在运行的代码永远无法获取或持有对它的引用,否则无法销毁对象。如果运行代码已经或可以获取对 X 的引用,并且 X 包含对 Y 的引用,系统将假定正在运行的代码可以获取对 Y 的引用。只要存在可能调用 GC.SuppressFinalize(X) 的执行路径,代码将需要保留对 X 的引用,以便将其传递给该方法(这意味着对象 X 必须继续存在直到那时)。
    【解决方案2】:

    原因可能是为了防止以后有人添加终结器并忘记添加 GC.SuppressFinalize() 时出现潜在错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 2012-12-20
      • 1970-01-01
      相关资源
      最近更新 更多