【发布时间】:2020-05-08 17:03:35
【问题描述】:
我在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打个电话。如果您在调试版本中,它可能还会出于调试原因保留t:变量的范围几乎与它何时可用于 GC 完全无关 -
一般来说,在 C# 中,很少需要编写终结器。写出好的定稿是非常困难的。如果您想要确定性完成(即,您希望清理代码在特定时间运行),请查看
IDisposable、using和 Dispose 模式
标签: c# testing garbage-collection nunit destructor