mt_*_*erg 10 c# clr garbage-collection memory-management finalizer
当我在C#中阅读一些关于内存管理的文章时,我对Finalizer方法感到困惑.
有许多与之相关的复杂规则.例如,没有人知道终结器何时被调用,即使ctor中的代码抛出,他们也会调用,CLR不保证在程序关闭时调用所有终结器等.
对于什么终结器可以在现实生活中使用?
我发现的唯一一个例子是程序在GC启动时发出蜂鸣声.
您是否在代码中使用了Finalizer并且可能有一些好样本?
UPD:
当开发人员想要确保某些类始终通过IDisposable正确处理时,可以使用终结器.(链接 ;感谢Steve Townsend)
有终结使用的详尽讨论,结合实例,在这里。链接@SLaks提供的相关答案。
另请参阅此处,以获得有关何时需要的更简洁的摘要(“不太经常”)。
有一个很好的答案之前,这里有另一个很好的现实世界的例子。
总结一下相关摘录:
需要终结器来确保将稀缺资源释放回操作系统,例如文件句柄,套接字,内核对象等。
有关更正确的真实示例,请在此MSDN搜索的.Net Framework中浏览受影响的类:
http://social.msdn.microsoft.com/Search/zh-CN?query=%22.Finalize%22&ac=8
我想到什么时候可能需要使用终结器的一个合理原因是,如果将第三方本机代码API包装在托管包装器中,并且基础本机代码API库要求及时释放使用的操作系统资源。
据我所知,最佳实践很简单,不要使用它们。然而,当您想要使用终结器时,可能会出现一些极端情况,特别是在处理非托管对象并且您无法实现 Dispose 模式(我不知道遗留问题)时,那么您可以谨慎地实现方法(Finalize
并且它可以减少系统的性能,使您的对象不死和其他可能奇怪的情况,注意异常,因为它们是无法捕获的:))。
99% 的情况下,只需编写使用 Dispose 模式并使用此方法自行清理,一切都会好起来的。