我有一个简单的类,定义如下。
public class Person
{
public Person()
{
}
public override string ToString()
{
return "I Still Exist!";
}
~Person()
{
p = this;
}
public static Person p;
}
在主要方法中
public static void Main(string[] args)
{
var x = new Person();
x = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine(Person.p == null);
}
是否应该将垃圾收集器作为Person.p的主要引用,以及何时确切调用析构函数?
@HimBromBeere
—
Parimal Raj
Person1
实际上是Person
,修正了输入错误。
@HimBromBeere这实际上是一个面试问题,根据我的理解,现在CG.Collect应该调用了析构函数,但没有。
—
Parimal Raj
(1)如果您在其finalizer中重新引用要最终确定的对象,则将无法对其进行垃圾收集,直到无法从根目录访问该引用为止(因此这会延迟其垃圾收集的效果)。(2)调用终结器的时间点是不可预测的。
—
马修·沃森
@HimBromBeere,当我在Console.WriteLine Person.p处设置断点时,无论
—
Parimal Raj
GC.Collect
调用如何,它都为null
Person1
?我只看到Person
。最后:有关终结器的工作方式,请参阅docs.microsoft.com/dotnet/csharp/programming-guide/…。