我从阅读MSDN文档中了解到,IDisposable接口的"主要"用途是清理非托管资源.
对我来说,"非托管"意味着数据库连接,套接字,窗口句柄等等.但是,我已经看到了Dispose()实现该方法以释放托管资源的代码,这对我来说似乎是多余的,因为垃圾收集器应该照顾那对你而言.
例如:
public class MyCollection : IDisposable
{
private List<String> _theList = new List<String>();
private Dictionary<String, Point> _theDict = new Dictionary<String, Point>();
// Die, clear it up! (free unmanaged resources)
public void Dispose()
{
_theList.clear();
_theDict.clear();
_theList = null;
_theDict = null;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这是否使得垃圾收集器可以使用的内存MyCollection比通常更快?
编辑:到目前为止,人们已经发布了一些使用IDisposable清理非托管资源(例如数据库连接和位图)的好例子.但是假设_theList在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?
我理解这个问题是否重复,但我在调整一些关于这个主题的帖子时遇到了一些麻烦.
首先是一点背景.我有一个类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实现在这里真的有必要吗?因为我无法说服自己.