[我在VS2019下的Nunit + .net core 2.0中有一个简单的测试代码:
public class Tests
{
public static int i = 0;
class First
{
~First()
{
i += 1;
Console.WriteLine("First's destructor is called.");
}
}
class Second : First
{
~Second() { i += 10; Console.WriteLine("Second's destructor is called."); }
}
class Third : Second
{
~Third() { i += 100; Console.WriteLine("Third's destructor is called."); }
}
[Test]
public static void Test()
{
{
Third t = new Third();
}
Thread.Sleep(1000);
System.GC.Collect();
Assert.AreEqual(111, i);
}
}
它总是失败,而我最终发现i = 0,并且在Test()之后立即调用析构函数。但是您可以看到“ t”在代码块中,并且在代码块之后无效,我也称
System.GC.Collect();
在我的“声明”之前。
为什么即使在GC之后也不会调用析构函数?如何修复我的代码以使测试通过?
非常感谢。
在GC.WaitForPendingFinalizers()
之后呼叫GC.Collect()
终结器(不是析构函数)作为后台任务异步运行,因此,在调用GC.Collect()
并到达断言语句后,不能保证终结器已经完成。