【问题标题】:Finalize method in System.Object classSystem.Object 类中的 Finalize 方法
【发布时间】:2011-01-08 13:07:35
【问题描述】:

出于好奇,我反汇编了 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”方法有什么用,为什么编译器会对其进行特殊处理?

【问题讨论】:

    标签: c# .net object finalize


    【解决方案1】:

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

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

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

    【讨论】:

    • +1 用于指出反射器中的错误。我总是盲目地依赖它:)。使用反射器时直接检查 IL 是明智的。
    【解决方案2】:

    对于第二个问题,C#的~MyClass在VB.NET中写成Protected Overrides Sub Finalize(),相当于protected override Finalize()。所以这只是 C# 语法的不同。

    第一个问题,在Reflector中是

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

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

    【讨论】:

      【解决方案3】:

      查看 MSDN 至 Object.Finalize:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多