终结器如何增加C#中对象的寿命?

终结器如何增加C#中对象的寿命?,c#,memory-management,memory-leaks,garbage-collection,finalizer,C#,Memory Management,Memory Leaks,Garbage Collection,Finalizer,我正在读一本关于C#内存管理的书,书中说: 重要的是要了解终结器会延长寿命 指一个物体。由于终结代码也必须运行,.NET 框架在特殊的终结中保留对对象的引用 队列另外一个线程一次运行所有终结器 根据执行上下文进行适当的调整。这是垃圾 具有终结器的类型的集合 据我所知,终结器将只在垃圾收集上运行,而不是在它之前运行。那么,它怎么能推迟垃圾收集呢?在浏览了由评论和删除答案发布的MSDN链接后,下面是整个过程的详细信息: 当(GC)发现一个可终结对象已死亡时,它的终结器将被放入队列中,以便执行它的清理

我正在读一本关于C#内存管理的书,书中说:

重要的是要了解终结器会延长寿命 指一个物体。由于终结代码也必须运行,.NET 框架在特殊的终结中保留对对象的引用 队列另外一个线程一次运行所有终结器 根据执行上下文进行适当的调整。这是垃圾 具有终结器的类型的集合


据我所知,终结器将只在垃圾收集上运行,而不是在它之前运行。那么,它怎么能推迟垃圾收集呢?

在浏览了由评论和删除答案发布的MSDN链接后,下面是整个过程的详细信息:

当(GC)发现一个可终结对象已死亡时,它的终结器将被放入队列中,以便执行它的清理操作,但对象本身将升级到下一代。因此,您必须等到该代上发生的下一次垃圾收集(不一定是下一次垃圾收集)来确定对象是否已被回收

以下是演示相同功能的代码:

using System;
class Program
{
    static void CreateDestructorReferences()
    {
        for (int i = 0; i < 1000; i++)
            _ = new Destructor();
    }
    static void CreateWithoutDestructorReferences()
    {
        for (int i = 0; i < 1000; i++)
            _ = new WithoutDestructor();
    }
    static void Main(string[] args)
    {
        CreateDestructorReferences();
        DemoGCProcess("****Objects With Destructors*****");
        CreateWithoutDestructorReferences();
        DemoGCProcess("****Objects Without Destructors*****");
        Console.ReadLine();
    }

    private static void DemoGCProcess(string text)
    {
        Console.WriteLine(text);
        var memory = GC.GetTotalMemory(false);
        GC.Collect(0);
        GC.WaitForPendingFinalizers();
        var memory1 = GC.GetTotalMemory(false);
        Console.WriteLine("Memory freed on first Garbage Collection on Generation 0:" + (memory - memory1));
        GC.Collect(1);
        var memory2 = GC.GetTotalMemory(false);
        Console.WriteLine("Memory freed on second Garbage Collection on Generation 0 and Generation 1:" + (memory1 - memory2));
    }
}
class Destructor
{

    ~Destructor()
    {
        //Console.WriteLine("Destructor is called");
    }
}
class WithoutDestructor
{

}
使用系统;
班级计划
{
静态void CreateDestructorReferences()
{
对于(int i=0;i<1000;i++)
_=新析构函数();
}
静态void createwithout destructorreferences()
{
对于(int i=0;i<1000;i++)
_=不带析构函数的新函数();
}
静态void Main(字符串[]参数)
{
CreateDestructorReferences();
DemoGCProcess(“****带析构函数的对象*******”);
createwithout destructorreferences();
DemoGCProcess(“****不带析构函数的对象*******”);
Console.ReadLine();
}
私有静态void DemoGCProcess(字符串文本)
{
控制台写入线(文本);
var memory=GC.GetTotalMemory(false);
GC.Collect(0);
GC.WaitForPendingFinalizers();
var memory1=GC.GetTotalMemory(false);
WriteLine(“第0代第一次垃圾回收时释放的内存:”+(内存-内存1));
GC.Collect(1);
var memory2=GC.GetTotalMemory(false);
WriteLine(“在第0代和第1代上的第二次垃圾回收中释放的内存:”+(memory1-memory2));
}
}
类析构函数
{
~Destructor()
{
//WriteLine(“调用析构函数”);
}
}
不带析构函数的类
{
}
这是上述程序的输出:

我不懂你不懂的东西。。。答案在引文中,这是否意味着终结器在垃圾收集之前运行?请参考官方文档,如。简言之,带有终结器的对象需要再进行一轮垃圾收集,这就是它们寿命更长的原因。