c# – MSDN Dispose()示例错误? (何时将托管引用设置为null)
MSDN’s example pattern用于实现Dispose()方法描述将对被管理资源的引用设置为null(_resource = null),但在if(处置)块之外执行此操作:
protected virtual void Dispose(bool disposing) { // If you need thread safety,use a lock around these // operations,as well as in your methods that use the resource. if (!_disposed) { if (disposing) { if (_resource != null) _resource.Dispose(); Console.WriteLine("Object disposed."); } // Indicate that the instance has been disposed. _resource = null; _disposed = true; } } 这个代码块中不应该放置_resource = null吗?如果调用Dispose(false),那么_resource将为null,无法随后处理! ?? 当然,Dispose(false)在完成时只被运行时调用(在实践中).但是,如果_resource以前没有被处理,当对象(包括_resource成员字段)即将被垃圾回收时,需要将此值设置为null? [原问题结束] 跟进: 经过很多阅读,看来设置引用为null并不是必需的,但是如果您有理由相信包含类(被处理的)可能不会很快被垃圾收集,则可能是“重”成员对象的好主意. 知道对象处理不能保证对象已经通过消耗代码被“释放”了.处置的对象可能会保留在(集合或其他方式)中,用于各种目的,或者只是错误.我可以想象一个使用集合中的对象然后处理它们的应用程序,但是将它们保留在集合中,以便后续进程执行删除并记录最终状态(或类似的内容…谁知道…) 结论: >将引用“重”成员对象设置为null释放它们 因此,我的偏好是将_resource = null放在最内层if块中: if (disposing) { if (_resource != null) { _resource.Dispose(); _resource = null; } } 这将所有的_resource代码保持在一起.进一步的想法,任何人? 更多阅读: > In the Dispose(bool) method implementation,Shouldn’t one set members to null? 解决方法
将其设置为null将删除引用或指向堆中位置的指针.这样,GC可以通过并删除任何没有引用它的东西,而无需做很多猜测. _resource将是一些内部使用对象,需要清理其引用,所以让我们说你有一个Socket内部关闭你将关闭/处理该套接字或任何其他持久资源.一旦它被处置,你将其设置为null并删除所有引用(应该删除所有引用),以便GC可以做到这一点.我的答案的下半部分是一个例子,所以它重复一些事情,但我希望你得到这个想法.
将它设置为空两次并不重要,因为没有任何效果.在清理任何资源时,处理应该是真实的,只要它是(就像你所说的)即将被垃圾收集的一样,只会是错误的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- “内存操作数的对齐”如何帮助MIPS进行流水线操作?
- Andriod 开发之布局文件XML Imageview的scaleType属性
- 正则表达式 – 解析mysql:/// sqlite:/// URL
- c# – 如何为一组控件提供单个工具提示,并使其显示顺畅?
- cocos2dx windows下隐藏边框(标题栏隐藏)
- objective-c – 更改UINavigationController视图和按钮(例如
- XML、DTD、XPATH要点总结
- postgresql 错误:游标<unnamed portal 1>不存在 问题
- objective-c – 为什么不会崩溃?
- 隐私泄露杀手锏 —— Flash 权限反射