我从阅读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在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?
据我所知,如果你有一个具有IDisposable的成员m的A类,A应该实现IDisposable,它应该在其中调用m.Dispose().
我找不到令人满意的理由,为什么会这样.
我理解规则如果你有非托管资源,你应该提供一个终结器和IDisposable,这样如果用户没有显式调用Dispose,终结器仍然会在GC期间清理.
但是,根据该规则,您似乎不需要具有此问题的规则.例如...
如果我有课:
class MyImage{
private Image _img;
... }
Run Code Online (Sandbox Code Playgroud)
公约规定我应该有MyImage : IDisposable.但是如果Image遵循惯例并实现了终结器而我并不关心资源的及时发布,那有什么意义呢?
UPDATE
我在这里找到了一个很好的讨论.
首先,对不起,如果这被认为是重复 - 我知道这是一个共同的话题,但我看了,但没有找到一个满意的答案.
有很多的问问题时要使用IDisposable,但一切我读过,我只是不明白为什么你不会在你的每类实现它.有什么可失去的?它是否有很大的性能影响?
我理解的部分原因IDisposable是它所做的一件事是:
Dispose()对象拥有的其他IDisposable.原谅我的无知,但这只适用于给定对象的字段/属性,还是也扩展到在其方法中创建的对象?
例如,如果a Font是在实现的类中的方法内创建的IDisposable,但是Font没有使用using块初始化,或者.Dispose()在方法的末尾显式地创建; 当它的IDisposable父母/班级被GCd /处置时会被处置吗?否则,Font永远不会被处置?
我并不是要离题,但如果确实这样做会像这样"抓住一切"(有效地处理任何IDisposable本来不会留下的错误的儿童对象),那么单凭这个理由不足以证明这一点.总是IDisposable尽可能地实施?