没有任何讨论的指南/注释/文章IDisposable
模式建议应该将内部成员设置为null
in the 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
您可能还想将任何事件设置为空:
someEventHandler = null;
如果调用者目前无法完全释放其引用(或只是忘记),这可以帮助最大程度地减少影响。虽然您应该尝试释放外部对象(对于 GC),但相对容易意外地延长对象的寿命,例如通过捕获的变量(匿名方法/lambda)、事件等。
如果你有一个终结器,那么在 GC 过程中这样做没有任何好处,并且你不应该真正调用外部对象的方法(甚至Dispose()
) - 简而言之:在 GC 扫描期间不要执行任何操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)