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();
}
}
}
环境:visual studio 2019
运行方式 ctrl+f5
ctrl + f5 不调试执行
不用纠结了,C#的析构函数确实不一定会执行,和C++的析构函数机制不一样,而且官方也不推荐使用析构函数释放堆栈,一般继承IDispose接口显式调用Dispose()即可,具体可以参考Winform框架自动生成的代码的写法
这很正常,执行肯定会执行,你打断点就知道。但是如果控制台先回收,那么你看不到输出。
GC.Collect() 不一定保证能立刻回收对象。1L的代码你要注意。