微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/csharp/95664.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐