在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模式并使用此方法自行清理,一切都会好的。