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语句(原始问题)的放置并不重要,原因有两个:(A)使用它完全是在阅读上面之后才考虑的; (B)在MSDN示例中,它对于Dispose(true)和Dispose(false)都执行,但后者仅在对象被确定并且即将被垃圾回收时才会发生!
因此,我的偏好是将_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?
> Do you need to dispose of objects and set them to null?
> http://www.codeproject.com/KB/dotnet/idisposable.aspx(很好,很久!)