为什么在“Dispose”方法中使用“GC.SuppressFinalize(this)”时不会触发类的析构函数(finalize)?

时间:2017-01-08 11:05:49

标签: c# .net garbage-collection

据我所知,当我们想要释放对象使用它们的非托管资源时,我们使用“IDisposable”接口的“Dispose”方法。

当对象不再可用时,将自动调用类的析构函数(以“〜”字符开头)。

我的问题是: 为什么在“Dispose”方法中使用“GC.SuppressFinalize(this)”时不会触发类的析构函数(finalize)?

参见示例No1,类的析构函数(~ClassTest())将被触发:

public class ClassTest : IDisposable
{
    public int PropA { get; set; }

    public ClassTest()
    {
        PropA = 10;
    }

    ~ClassTest()
    {
        Console.WriteLine("destructor");
    }

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

class Program
{
    static void Main(string[] args)
    {
        using (ClassTest cT = new ClassTest())
        {
        }
    }
}

参见示例No2,类的析构函数(~ClassTest())不会被触发:

public class ClassTest : IDisposable
{
    public int PropA { get; set; }

    public ClassTest()
    {
        PropA = 10;
    }

    ~ClassTest()
    {
        Console.WriteLine("destructor");
    }

    public void Dispose()
    {
        //it causes ~ClassTest() will not be fired, why?
        GC.SuppressFinalize(this);
        Console.WriteLine("dispose");
    }
}

class Program
{
    static void Main(string[] args)
    {
        using (ClassTest cT = new ClassTest())
        {
        }
    }
}

我见过一个Microsoft MSDN导致提出这个问题的例子: IDisposable Interface

1 个答案:

答案 0 :(得分:1)

除非存在通信故障,否则答案在方法名称中:GC.SuppressFinalize。 禁止,停止,完成对给定对象的运行。在Dispose或其他任何地方调用它都会产生这种效果。