[C#析构函数即使在代码作用域+ GC之后也未调用?

问题描述 投票:0回答:1

[我在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之后也不会调用析构函数?如何修复我的代码以使测试通过?

非常感谢。

c# testing garbage-collection nunit destructor
1个回答
0
投票

GC.WaitForPendingFinalizers()之后呼叫GC.Collect()

终结器(不是析构函数)作为后台任务异步运行,因此,在调用GC.Collect()并到达断言语句后,不能保证终结器已经完成。

© www.soinside.com 2019 - 2024. All rights reserved.