在System.Object类中的Finalize方法

时间:2010-01-23 12:04:28

标签: c# .net object finalize

出于好奇,我反汇编了mscorlib.dll以检查System.Object类的实现。

我发现了一些奇怪的东西。

1).    
public class Object {
...
    protected override void Finalize(){}
...
}

为什么基类中有覆盖方法?

2) public class Employee {
            public void InstanceMethod() {
                this.Finalize();
                //Does not compile, can i not access protected methods of base class??
            }
        }

我只是想知道在Object类中使用“protected Finalize”方法有什么用处,以及为什么它会被编译器特殊处理?

3 个答案:

答案 0 :(得分:4)

这是Reflector中的一个错误,它被一个虚拟但没有“newslot”属性并且没有基类类型的方法搞糊涂了。将反编译器切换到IL时可能更容易看到。

从参考源复制的终结器的真实声明与您期望的一样:

// Allow an object to free resources before the object is reclaimed by the GC.
//
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
~Object()
{
}

答案 1 :(得分:1)

对于第二个问题,C#的~MyClass用VB.NET编写为Protected Overrides Sub Finalize(),相当于protected override Finalize()。所以这只是C#语法的区别。

对于第一个问题,在Reflector中它是

.method family hidebysig virtual instance void Finalize() cil managed

缺少newslot属性,与重写相比,通常会在新虚拟成员上看到。

答案 2 :(得分:0)

查看MSDN到Object.Finalize

  

析构函数是执行清理操作的C#机制。析构函数提供适当的安全措施,例如自动调用基类型的析构函数。在C#代码中,无法调用或覆盖Object.Finalize。

因此,你的问题的答案是:嗯 - 这是CLR内部的一部分; C#编译器完成编写时所需的所有工作,例如:

public class Employee
{
   //Finalizer, also known as "destructor"
   ~Employee()
   {

   }
}