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 类中“受保护的 Finalize”方法的用途是什么,为什么编译器会对它进行特殊处理?

4

3 回答 3

4

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

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

// Allow an object to free resources before the object is reclaimed by the GC.
//
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
~Object()
{
}
于 2010-01-23T12:34:13.360 回答
1

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

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

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

newslot与被覆盖相比,通常在新虚拟成员上看到的缺少属性。

于 2010-01-23T12:35:53.233 回答
0

查看 MSDN 到Object.Finalize

析构函数是用于执行清理操作的 C# 机制。析构函数提供了适当的保护,例如自动调用基类型的析构函数。在 C# 代码中,Object.Finalize 不能被调用或覆盖。

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

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

   }
}
于 2010-01-23T12:13:40.130 回答