一尘不染

垃圾收集器会调用Dispose()吗?[重复]

c#

这个问题已经在这里有了答案

垃圾收集器会打给IDisposable.Dispose给我吗? (9个答案)

5年前关闭。

我以为,如果您的程序没有,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()-使用一次性对象时,我确实遵循标准模式。之所以出现我的问题,是因为我试图追踪别人代码中的泄漏,该代码是托管C
++(另一层复杂性,这可能是另一个线程的主题)。


阅读 224

收藏
2020-05-19

共1个答案

一尘不染

GC不会调用Dispose,它会调用终结器(您应该调用Dispose(false))。

请查看侧面的相关文章或查找Dispose模式的C#最佳做法(有关文档的IDisposable IIRC解释得很好)。

2020-05-19