微软模式方法与GC的矛盾?

时间:2011-12-02 14:20:13

标签: c# .net garbage-collection

我知道dispose函数的作用是清除非托管资源。

但根据Microsoft's pattern(据我所知)他们这样做:

他们开了一个新的集中功能,它需要bool(isDispoisng);

如果是True,那么它来自dispose func(使用using或其他内容) - 它会清除非托管并托管

if false,它来自终结器/析构函数。并且他只是杀死了无人管理的人。

我不明白为什么微软的模式会杀死managed如果isDispoisng==True(参见粗体字)。

认为 finilize应该杀死只是非托管....

你能解释一下吗?

他们想要在这方面取得什么成果?

2 个答案:

答案 0 :(得分:4)

因为您的托管资源可能会保留可能需要处理的其他(非托管)资源。

因此,任何实现IDisposable的对象都应该通过调用它的Dispose方法来处理。

编辑:事实上,还需要消除事件处理程序连接,否则会阻止对象超出范围并被垃圾收集。

答案 1 :(得分:0)

最终确定涉及性能和延迟成本。理想情况下,对于任何给定的实例,我们应该避免尝试避免调用终结器。如果调用Dispose并清除非托管资源,则可以这样做。

如果您对推荐的处置模式的解释比您在大多数MSDN内容中找到的更清楚,http://msdn.microsoft.com/en-us/magazine/cc163392.aspx是一个非常好的起点。

顺便说一句,从.NET 2.0开始,终结器的实现不再是清理非托管资源的推荐方法。相反,除了SafeHandle之外,你应该使用very few "special" scenarios