c#无法显示析构函数。
using System;

namespace Destructor
{
    class ClassA {
        public ClassA() {
            Console.WriteLine("ClassA构造函数");
        }
        ~ClassA() {
            Console.WriteLine("ClassA析构函数");
        }

    }

    class ClassB
    {
        public ClassB()
        {
            Console.WriteLine("ClassB构造函数");
        }
        ~ClassB()
        {
            Console.WriteLine("ClassB析构函数");
        }
        public void CreateObject()
        {
            Console.WriteLine("进入ClassB.CreateObject()");
            ClassA classA = new ClassA();
            Console.WriteLine("退出ClassB.CreateObject()");
        }
    }
    class Test
    {
        static void Main(string[] args)
        {
            Console.WriteLine("进入Main");
            ClassB classB = new ClassB();
            classB.CreateObject();
            Console.WriteLine("退出Main");
            GC.Collect();
        }
    }
}

图片说明

为什么只显示了ClassA析构函数,ClassB析构函数不显示?

环境:visual studio 2019
图片说明

运行方式 ctrl+f5

3个回答

ctrl + f5 不调试执行 图片说明

meng17332312132
梦青尘 感谢回复
6 个月之前 回复
meng17332312132
梦青尘 回复: 不管是ctrl + f5 还是 f5 都是一样的结果
6 个月之前 回复
meng17332312132
梦青尘 我是visual studio 2019
6 个月之前 回复

不用纠结了,C#的析构函数确实不一定会执行,和C++的析构函数机制不一样,而且官方也不推荐使用析构函数释放堆栈,一般继承IDispose接口显式调用Dispose()即可,具体可以参考Winform框架自动生成的代码的写法

meng17332312132
梦青尘 请问如何在控制台中看到ClassB析构函数
6 个月之前 回复
meng17332312132
梦青尘 感谢回复
6 个月之前 回复

这很正常,执行肯定会执行,你打断点就知道。但是如果控制台先回收,那么你看不到输出。

GC.Collect() 不一定保证能立刻回收对象。1L的代码你要注意。

meng17332312132
梦青尘 请问如何在控制台中看到ClassB析构函数
6 个月之前 回复
meng17332312132
梦青尘 感谢回复
6 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐