【发布时间】:2019-09-21 22:48:55
【问题描述】:
因为finalizer/IDisposable 和所谓的“IDisposable 模式”主题往往会引发大量装腔作势、夸夸其谈和好战的观点(不是——分别是here、@987654322 @、here 等等),我真的很犹豫要问这个问题。希望先发制人那些陈旧的辩论,我坚持一个非常简单的问题,在 StackOverflow 上似乎没有简明的答案......
一旦对象的终结器开始执行,调用GC.SuppressFinalize(this) 是否是空的?更具体或更有用(当然),从终结器本身调用GC.SuppressFinalize(this) 是否无害? (同样,我们在这里不讨论任何“为什么”)
换句话说,除了调用 API 的开销并在对象标头中适当地设置一个标志之外,是否存在任何不良、不需要或其他明显的正确性或性能影响?
【问题讨论】:
-
Is calling GC.SuppressFinalize(this) vacuous once the object's finalizer has begun executing?- 根据Remarks section 中的措辞,是的。尽管如此,according to the IDisposable pattern,这不是放置GC.SuppressFinalize的地方。 -
@GSerg 谢谢,你说得对,is 是文档摘录中的 wording 问题,我我想我希望能更明确地确定它。至于那个所谓的“模式”。我试图阻止这种诱饵......
-
如果它在文档中,那么这就是明确的答案。如果您在执行文档中所说的操作时遇到问题,那么 Microsoft 会将其视为错误(他们可能不会修复它,但 GC 和终结是重要的事情)。处置模式一直以来都有很好的记录 - 我很惊讶有争议。也就是说,你确定你需要一个终结器吗?你读过终结者不能做的所有事情吗?编写终结器的需求很少见,而编写一个可靠的终结器很难。
-
它只是对象中的一个标志,如果用于其预期目的将没有明显的开销(实际上它是 GC 的排序优化(松散使用的术语)并且具有非常特定的目的),您是否需要标记不需要最终确定或所有非托管代码已被清理?在 finalizer 开始后调用
SuppressFinalize似乎很可疑,这不是它的预期用例,也与其生活目标背道而驰。正如我们所知(我相信你也知道)终结器/析构函数是一个非常热门的话题,因为它们几乎没有用例 -
@Flydog57 问题是文档并没有完全准确地回答这个问题。它说,“如果 obj 没有终结器,则对
SuppressFinalize方法的调用无效。”这并不一定意味着SuppressFinalize对 具有终结器的对象没有影响。
标签: c# garbage-collection finalizer