讨论IDisposable
模式的指南/注释/文章都没有提出应该null
在Dispose(bool)
方法中设置内部成员(特别是如果它们是内存占用的野兽).
在调试内部基准测试工具时,我逐渐意识到它的重要性.过去常见的是,这个缓冲区内部包含一个大数组.我们过去常常为整个基准程序使用静态缓冲区.一旦我们完成缓冲区,我们就无法释放这个内部数组,也不能让这个缓冲区可释放(因为它是静态的).
所以,我相信,在Dispose()
调用之后,类应该尽其所能,以便它释放它正在使用的所有资源并使它们再次可用,即使被处理的对象本身没有被GC收回,也没有设置因此,成员为null,不允许GC收集内部对象意味着Dispose实现并不完美.
你对此有何看法?
释放任何其他参考资料Dispose
当然是我尝试做的事情,原因有两个:
它允许内部对象被垃圾收集,即使被处置对象仍在范围内
如果内部物体是一次性的,这意味着即使Dispose()
在外部物体上反复调用,我们也只会将它们丢弃一次
例如,我倾向于使用以下内容:
if(someDisposableObject != null) { someDisposableObject.Dispose(); someDisposableObject = null; } (for non-disposable, just set to null) someNonDisposableObject = null; // etc
您可能还想将任何事件设置为null:
someEventHandler = null;
如果呼叫者此刻无法完全释放其引用(或简单地忘记),这可以帮助最小化影响.虽然您应该尝试释放外部对象(对于GC),但是相对容易意外地延长对象的生命周期,例如通过捕获的变量(匿名方法/ lambda),事件等.
如果你有一个终结器,那么在GC过程中这样做是没有好处的,你不应该真的在外部对象上调用方法(偶数Dispose()
) - 所以简而言之:在GC扫描期间不要做任何这样的事情.