据我所知,当我们想要释放对象使用它们的非托管资源时,我们使用“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
答案 0 :(得分:1)
除非存在通信故障,否则答案在方法名称中:GC.SuppressFinalize。 禁止,停止,完成对给定对象的运行。在Dispose或其他任何地方调用它都会产生这种效果。