如何调用Finalize()?

时间:2019-06-11 05:23:56

标签: c# .net

我试图查找有关我的问题的现有帖子,但找不到。

首先,我的.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#知识的了解不是很强

1 个答案:

答案 0 :(得分:4)

首先,如果您正在使用或实现 Finalizers ,则您很有可能做错了什么事(除了极少数例外,我能想到的实际情况除外)

与使用new运算符显式调用的构造函数不同,不能从代码内部显式调用 finalizers / p>

垃圾收集器负责在对象实例上调用 finalizer 。仅仅因为您不能称之为微不足道,.Net Framework才能完成您无法做到的事情。

因此,简而言之,开发人员无法在编译时确切确定 finalizer 的执行时间。我们所知道的是, finalizer 可能在上次使用对象与应用程序正常关闭(甚至可能无法运行)之间的某个时间运行。