在处理时废除托管资源

LJM*_*LJM 3 .net c# garbage-collection idisposable

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

我理解这个问题是否重复,但我在调整一些关于这个主题的帖子时遇到了一些麻烦.

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

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

    public void Dispose()
    {
        _reallyBigDictionary = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

已知Foo的实例范围有限(即我知道我们不会永远保持它).鉴于它的实例范围有限,我没有看到_reallyBigDictionary如何实际上比释放更快地释放内存.我理解它的方式,这些对象在运行垃圾收集之前不会被清除.那时,无论如何,对给定Foo实例的引用都将为null,因此我希望GC能够回收该内存.

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

内存泄漏问题:处置或不处置托管资源?

摧毁所有对象或让垃圾收集器完成工作更好吗?

这篇文章让我质疑: 正确使用IDisposable接口

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

Ste*_*ary 12

你不需要IDisposable; 这就是原因.总之,您需要遵循规则1:IDisposable除非您需要,否则不要执行.

IDisposable需要实现两种情况:

  • 该类拥有非托管资源.
  • 该类拥有managed(IDisposable)资源.

既然Dictionary<int, string>不是IDisposable,你的班级也不应该.