在处置时清除托管资源

可能重复:
任何意义在Dispose()中设置obj = null(Nothing)?

我理解这个问题是否作为重复被关闭,但我在协调关于此主题的一些帖子时遇到了一些麻烦。

首先有一点背景。 我有一个类Foo如下

public class Foo : IDisposable
{
    private Dictionary<int, string> _reallyBigDictionary = 
            new Dictionary<int, string>();

    public void Dispose()
    {
        _reallyBigDictionary = null;
    }
}

众所周知,Foo的实例的范围是有限的(即我知道我们不会永远保持它)。 鉴于它是实例的有限范围,我没有看到_reallyBigDictionary实际上是如何将配置空间释放的更快。 按照我的理解,这些对象在垃圾收集运行之前不会被清理干净。 那时,对Foo给定实例的引用无论如何都是空的,所以我希望GC不管收回那个内存。

这些帖子让我相信将成员变量设置为null是没有意义的:

内存泄漏问题:处置还是不处置管理资源?

销毁所有对象还是让垃圾收集器完成这项工作更好?

这篇文章让我不以为然:正确使用IDisposable接口

任何人都可以为我澄清这一点吗? IDisposable的实现在这里真的需要吗? 因为我无法说服自己。


你不需要IDisposable ; 这是为什么。 总之,您需要遵循规则1:除非需要,否则不要实施IDisposable

当需要实现IDisposable时,只有两种情况:

  • 这个班拥有非托管资源。
  • 该类拥有托管( IDisposable )资源。
  • 由于Dictionary<int, string>不是IDisposable ,所以你的类不应该是。


    通过实现IDisposable接口,您可以使用Using语句来限定资源的Using范围。 另外,.NET Framework中的许多类都会检测到某个类是IDisposable,并为您运行Dispose() ,从而免除了您负责管理的子对象的责任。

    编辑----

    由于评论和减价,我认为Id增加了我的答案:

    .NET Framework中的许多类都实现了IDisposable - 例如许多通用集合类型。 当您处理这样的集合时,Microsoft实现将调用您的类的Dispose方法,并检测到它实现了IDisposable。 此外,还有一种情况是将一个对象的引用设置为null,包括可能在您的Dispose方法中。 如果要删除对象的引用,请将引用设置为null。 其他类可能需要维护对同一对象的引用,所以将参数设置为null的参数是错误的“是一个有缺陷的论证。 使用Dispose方法将引用设置为null与以任何其他方式将其设置为null没有什么不同 - 但是通过在您的IDisposable实现中执行此操作,您可以采用更确定且防错的方法来确保发生此情况。 实现IDisposable也是实现范围界定的一种很好的方式,例如用于事务性算法等。实现IDisposable在很多方面都是有用的,并且需要避免,只要你知道它是如何工作的以及为什么工作的。 它总是令我惊奇的是,很少有.NET开发人员真正理解IDisposable接口,Finalizers,垃圾收集器和.NET最佳实践


    在这种情况下,我认为不需要处置。 这不像它是一个活跃的连接,将保持开放并继续使用资源。 当你使用它时,它会自行管理。

    如果您确实想确保这段代码没有内存泄漏,您可以尝试将以下内容添加到dispose方法中:

    GC.Collect();
    
    链接地址: http://www.djcxy.com/p/9235.html

    上一篇: Nulling Out Managed Resources on Dispose

    下一篇: Writing our own Dispose method instead of using Idisposable