14

当我阅读了几篇关于 C# 中内存管理的文章时,我对 Finalizer 方法感到困惑。

有很多复杂的规则与之相关。例如,没有人知道终结器何时会被调用,即使 ctor 中的代码抛出,它们也会调用,CLR 不保证在程序关闭时调用所有终结器等。

在现实生活中可以使用哪些终结器?

我发现的唯一一个例子是 GC 启动时发出哔哔声的程序。

您是否在代码中使用终结器并且可能有一些好的示例?

升级版:

当开发人员想要确保某些类始终通过 IDisposable 正确处理时,可以使用终结器。(链接;感谢史蒂夫汤森

4

2 回答 2

5

此处对 Finalizer 的使用进行了详尽的讨论,并附有示例。在相关答案中由@SLaks 提供链接。

另请参阅此处以获取有关何时需要的更简洁的摘要(“不经常”)。

这里有一个很好的先前答案,还有另一个很好的真实示例。

用相关的摘录总结一下:

需要终结器来保证将稀缺资源释放回操作系统,如文件句柄、套接字、内核对象等。

有关更正确的真实示例,请浏览 .Net Framework 中受影响的类,此 MSDN 搜索:

http://social.msdn.microsoft.com/Search/en-US?query=%22.Finalize%22&ac=8

当您可能需要使用终结器时,我能想到的一个有效原因是,如果您将第三方本机代码 API 包装在托管包装器中,并且底层本机代码 API 库需要及时释放已使用的操作系统资源。

于 2010-11-03T15:12:51.560 回答
4

我知道的最佳实践很简单,不要使用它们。但是,当您想使用终结器时可能存在一些极端情况,特别是在处理非托管对象并且您无法实现 Dispose 模式(我不知道遗留问题)时,您可以Finalize谨慎地实现方法(并且它可以减少你的系统的性能,使你的对象不死和其他可能奇怪的场景,注意异常,因为它们是无法捕获的:))。

在 99% 的情况下,只需编写使用 Dispose 模式并使用此方法自行清理,一切都会好起来的。

于 2010-11-03T15:20:10.823 回答