在.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对象复活"(以及类似的术语),你会发现像:
复活和.NET垃圾收集器
对象复活
只要确保这些僵尸物体不会回来并试图吃掉你的大脑或其他东西.像所有的死灵法一样,这是危险的东西.(主要是因为类层次结构中较高的终结器可以释放一些必要的资源.另请注意,如果对象获得"未引用",则终止器将不会再次运行,除非您调用GC.ReRegisterForFinalize
.)