当前位置:  开发笔记 > 编程语言 > 正文

在Dispose(bool)方法实现中,是否应该将成员设置为null?

如何解决《在Dispose(bool)方法实现中,是否应该将成员设置为null?》经验,为你挑选了1个好方法。

讨论IDisposable模式的指南/注释/文章都没有提出应该nullDispose(bool)方法中设置内部成员(特别是如果它们是内存占用的野兽).

在调试内部基准测试工具时,我逐渐意识到它的重要性.过去常见的是,这个缓冲区内部包含一个大数组.我们过去常常为整个基准程序使用静态缓冲区.一旦我们完成缓冲区,我们就无法释放这个内部数组,也不能让这个缓冲区可释放(因为它是静态的).

所以,我相信,在Dispose()调用之后,类应该尽其所能,以便它释放它正在使用的所有资源并使它们再次可用,即使被处理的对象本身没有被GC收回,也没有设置因此,成员为null,不允许GC收集内部对象意味着Dispose实现并不完美.

你对此有何看法?



1> Marc Gravell..:

释放任何其他参考资料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扫描期间不要做任何这样的事情.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有