在 .net 中编写以下内容是否合法?

   public class A
    {
        public int i = 0;
        ~A()
        {
            Aref = this;
        }
    }


    public static A Aref;
    static void Main(string[] args)
    {
        Aref = new A();
        int gen = GC.GetGeneration(Aref);
        Aref = null;
        GC.Collect(gen, GCCollectionMode.Forced);
        GC.WaitForPendingFinalizers();
        Console.WriteLine(Aref.i);
        Console.ReadLine();
    }

它可以正常工作并按预期将“0”写入控制台,但我想知道它是否能保证始终有效。

有人知道幕后发生了什么吗?

最佳答案

这叫做复活,而且是合法的。谷歌搜索“.net object resurrection”(以及类似的术语),你会发现以下内容:

Resurrection and the .NET Garbage collector

Object Resurrection

只要确保这些僵尸物体不会回来并试图吃掉你的大脑或其他东西。像所有的死灵法术一样,这是危险的东西。 (主要是因为类层次结构中较高的终结器可以释放一些必要的资源。另请注意,如果对象“未引用”,终结器将不会第二次运行,除非您调用 GC.ReRegisterForFinalize 。)

10-08 07:19