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