在最终确定时存储'this'

Luc*_*uca 5 c# garbage-collection finalizer .net-2.0

如何定义在类定型期间存储'this'的代码?垃圾收集器应该如何表现(如果在某处定义)?

在我看来,GC应该多次完成类实例,并且以下测试应用程序将打印"66",但终结器只执行一次,导致应用程序打印"6".

几行代码:

using System;

namespace Test
{
    class Finalized
    {
        ~Finalized()
        {
            Program.mFinalized = this;
        }

        public int X = 5;
    }

    class Program
    {
        public static Finalized mFinalized = null;

        static void Main(string[] args)
        {
            Finalized asd = new Finalized();
            asd.X = 6;
            asd = null;
            GC.Collect();

            if (mFinalized != null)
                Console.Write("{0}", mFinalized.X);

            mFinalized = null;
            GC.Collect();

            if (mFinalized != null)
                Console.Write("{0}", mFinalized.X);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我要做的是了解终结器如何管理实例内存.在我的应用程序中可能希望再次重用实例引用以进行进一步处理.

很明显终结器不会"释放"内存(至少在我的测试应用程序中).可以将内存块重用于其他目的吗?甚至解放了?如果不是,那会是内存泄漏还是什么?

现在,我比以前更困惑了.

Ree*_*sey 8

这是由于复活.通过在最终确定期间将对象存储在另一个变量中(分配this给变量),就GC而言,您将恢复 obejct实例.您可以在.NET中恢复对象,并且实际上可以使GC多次完成对象,但您必须通过GC.ReRegisterForFinalize显式请求它.

有关详细信息,请参阅Microsoft .NET Framework中的自动内存管理.