System.Object类中的Finalize方法

3

出于好奇,我反汇编了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个回答

4

这是Reflector中的一个错误,它会被一个虚方法所困扰,但该方法没有“newslot”属性,也没有基类类型。当你将反编译器切换到IL时,可能更容易看到。

从参考源代码中复制的finalizer的真实声明与您预期的大致相同:

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

指出反射器中的一个错误加1分。我一直盲目地依赖它:)。在使用反射器时直接检查IL是明智的选择。 - Manish Basantani

1
对于第二个问题,C#中的~MyClass在VB.NET中写作Protected Overrides Sub Finalize(),相当于protected override Finalize()。因此,这只是C#语法上的差异。
至于第一个问题,在Reflector中是这样的:
.method family hidebysig virtual instance void Finalize() cil managed

相对于被覆盖的成员,新虚拟成员通常缺少newslot属性。


0

请查看 MSDN Object.Finalize

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

因此,对于您的问题的答案是:这是 CLR 的内部部分;当编写例如:

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

   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接