談談Object類的終止器的實現!

iDotNetSpace發表於2009-10-22
在用Reflector載入mscorlib.dll後,看到System.Object類中的Finalize方法是用override修飾的.
Object是根類,顯然不可能重寫其他方法,這裡應該是反編譯工具生成的結果不正確,我們來驗證這一點:

大家都知道,為了減輕開發人員的負擔,C#中為Finalize方法的定義提供了特殊的語法,用這個語法來定義Finalize方法,編譯器可以自動生成合適的異常處理的程式碼,並呼叫基類的Finalize方法!

     Object類的Finalize方法的原始碼是這樣的:
    ~Object()
    {
    }
    可以看到這個方法什麼也沒有做!

   我們使用ILDasm工具來檢視IL程式碼:
.method family hidebysig virtual instance void
        Finalize() cil managed
{
  .custom instance void System.Runtime.ConstrainedExecution.ReliabilityContractAttribute::.ctor(valuetype System.Runtime.ConstrainedExecution.Consistency,
                                                                                                valuetype System.Runtime.ConstrainedExecution.Cer) = ( 01 00 03 00 00 00 02 00 00 00 00 00 )
  // 程式碼大小       1 (0x1)
  .maxstack  8
  IL_0000:  ret
} // end of method Object::Finalize

這實際上是一個Virtual方法,並不是override其他方法
    一般類中(如果需要的話)都是重寫這個方法來新增終止器實現的。

    Reflector可能沒有正確的解析Object類的所以這裡Reflector的反編譯結果有誤,並不是override其他方法。

原文地址:http://www.cnblogs.com/xuefeng1982/archive/2009/10/21/1587634.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-617180/,如需轉載,請註明出處,否則將追究法律責任。

相關文章