我从阅读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;
    }
我的问题是,这是否使得垃圾收集器可以使用的内存MyCollection比通常更快?
编辑:到目前为止,人们已经发布了一些使用IDisposable清理非托管资源(例如数据库连接和位图)的好例子.但是假设_theList在上面的代码中包含了一百万个字符串,并且你想现在释放那个内存,而不是等待垃圾收集器.上面的代码会实现吗?
.NET IDisposable Pattern 意味着如果您编写终结器并实现IDisposable,则终结器需要显式调用Dispose.这是合乎逻辑的,而且在极少数情况下我总是会做终结器的保证.
但是,如果我这样做会发生什么:
class Foo : IDisposable
{
     public void Dispose(){ CloseSomeHandle(); }
}
并且不要实现终结器或任何东西.框架会为我调用Dispose方法吗?
是的,我意识到这听起来很愚蠢,而且所有的逻辑都暗示它不会,但我总是有两件事让我不确定.
几年前有人曾告诉我,事实上它会这样做,而且那个人有"非常了解他们的东西"的良好记录.
编译器/框架根据您实现的接口(例如:foreach,扩展方法,基于属性的序列化等)执行其他"神奇"操作,因此这也可能是"魔术".
虽然我已经阅读了很多关于它的内容,并且有很多暗示的内容,但我从来没有能够找到这个问题的肯定是或否答案.
根据Essential C#6.0,你应该:
AVOID在拥有终结器的拥有对象上调用Dispose().相反,依靠终结队列来清理实例.
Finalizer?Close()/ Close()+ Dispose()?对于非常具体的类型(MemoryStream/ Form/ SqlConnection/ etc),我在网络上看到了很多问题,但我更关注"如何自己解决".根据Dispose Pattern你应该:
除了Dispose()之外,CONSIDER提供方法Close(),如果close是该区域中的标准术语.这样做时,将Close实现与Dispose相同并考虑显式实现IDisposable.Dispose方法非常重要.
但有时候你应该像两个人一样打电话Form等.像" 关闭和处理 - 要打电话的人? "这样的问题越来越接近,但除此之外没有明确的方法
像往常一样答案是:这取决于.不同的类以不同的方式实现IDisposable,由您来做必要的研究.
编辑:这是完整的指南,我没有要求复制许可,但因为它是一个指南(因此假设它应该是自由共享的公共知识)而不是实际培训材料的某些部分,我希望我'我没有违反任何规则.
准则
DO仅对具有稀缺或昂贵资源的对象实施终结器方法,即使最终化延迟了垃圾收集.
实现IDisposable以支持具有终结器的类的确定性终结.
如果没有显式调用Dispose(),请对实现IDisposable的类实现终结器方法.
DO重构一个finalization方法来调用与IDisposable相同的代码,也许只是调用Dispose()方法.
不要从终结器方法中抛出异常.
从Dispose()调用System.GC.SuppressFinalize()以避免重复资源清理并延迟对象上的垃圾回收.
确保Dispose()是幂等的(应该可以多次调用Dispose()).
保持Dispose()简单,专注于最终化所需的资源清理.
AVOID在拥有终结器的拥有对象上调用Dispose().相反,依靠终结队列来清理实例.
避免引用在最终确定期间未完成的其他对象.
在重写Dispose()时,请调用基类的Dispose()方法.
在调用Dispose()之后,考虑确保对象变得不可用.在处理了一个对象之后,Dispose()以外的方法(可能被多次调用)应抛出一个ObjectDisposedException.
在具有一次性字段(或属性)的类型上实现IDisposable并处理所述实例.
有人可以解释如果你不是Dispose某个IDisposable实体(通过using或直接Dispose电话)可能会发生什么?
这是否总是导致内存泄漏?如果是,C#内存泄漏类似于C++内存泄漏,C#从这个角度来看,它们很容易导致崩溃或沙箱更安全?
谢谢.