垃圾收集器调用Dispose()吗?

时间:2009-11-07 03:11:36

标签: c# .net memory dispose garbage-collection

我认为如果您的程序没有,GC最终会调用Dispose,但是您应该在程序中调用Dispose(),以确保清理。

然而,从我的小测试程序来看,我根本没有看到Dispose被调用....

public class Test : IDisposable
{
    static void Main(string[] args)
    {
        Test s = new Test();
        s = null;
        GC.Collect();
        Console.ReadLine();
    }

    public Test()
    {
        Console.WriteLine("Constructor");
    }

    public void Dispose()
    {
        Console.WriteLine("Dispose");
    }
}

//输出只是“构造函数”,我没有像我期望的那样得到“Dispose”。怎么了?

编辑:是的,我知道我应该调用Dispose() - 我在使用一次性对象时遵循标准模式。我的问题出现了,因为我试图追踪某些elses代码中的泄漏,这是一个托管C ++(另一个复杂的层,可能是另一个线程的好主题)。

2 个答案:

答案 0 :(得分:54)

GC不会致电Dispose,它会调用您的终结器(您应拨打Dispose(false))。

请查看旁边的相关帖子或查看Dispose模式的C#最佳实践(docs on IDisposable解释得非常好IIRC。)

答案 1 :(得分:2)

简短回答是“不”。我可以在对"Is it bad practice to depend on the .NET Garbage Collector""What happens if I don't call Dispose()"

的回复中找到更详细的答案