c# – MSDN Dispose()示例错误? (何时将托管引用设置为null)

前端之家收集整理的这篇文章主要介绍了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语句(原始问题)的放置并不重要,原因有两个:(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(很好,很久!)

解决方法

将其设置为null将删除引用或指向堆中位置的指针.这样,GC可以通过并删除任何没有引用它的东西,而无需做很多猜测. _resource将是一些内部使用对象,需要清理其引用,所以让我们说你有一个Socket内部关闭你将关闭/处理该套接字或任何其他持久资源.一旦它被处置,你将其设置为null并删除所有引用(应该删除所有引用),以便GC可以做到这一点.我的答案的下半部分是一个例子,所以它重复一些事情,但我希望你得到这个想法.

将它设置为空两次并不重要,因为没有任何效果.在清理任何资源时,处理应该是真实的,只要它是(就像你所说的)即将被垃圾收集的一样,只会是错误的.

原文链接:https://www.f2er.com/csharp/95664.html

猜你在找的C#相关文章