我试图查找有关我的问题的现有帖子,但找不到。
首先,我的.net书说: .NET的最高基类System.Object定义了一个虚拟方法 将Finalize()命名为:
public class Object
{
...
protected virtual void Finalize() {}
}
但是我在VS定义或https://referencesource.microsoft.com/#mscorlib/system/object.cs
中找不到此方法第二,由于Finalize()是受保护的,这意味着您不能像thisObject.Finalize()
那样真正使用点运算符来调用此方法,对于Garage Collector来说也是如此,它不能使用点运算符来调用该方法。 ,但是我们知道GC必须先调用对象的Finalize方法,然后再将其从内存中删除。这是否意味着对象类中还有另一个公共API,可以间接调用Finalize():
public class Object
{
...
protected virtual void Finalize() {}
public void XXX()
{
Finalize();
}
}
以便GC可以将方法调用为:object.XXX()?
抱歉,如果您觉得我的问题很愚蠢,那么我对C#知识的了解不是很强
答案 0 :(得分:4)
首先,如果您正在使用或实现 Finalizers ,则您很有可能做错了什么事(除了极少数例外,我能想到的实际情况除外)
与使用 垃圾收集器负责在对象实例上调用 finalizer 。仅仅因为您不能称之为微不足道,.Net Framework才能完成您无法做到的事情。 因此,简而言之,开发人员无法在编译时确切确定 finalizer 的执行时间。我们所知道的是, finalizer 可能在上次使用对象与应用程序正常关闭(甚至可能无法运行)之间的某个时间运行。new
运算符显式调用的构造函数不同,不能从代码内部显式调用 finalizers 。 / p>