2010-01-23 82 views
3

出於好奇心,我反彙編了mscorlib.dll來檢查System.Object類的實現。System.Object類中的Finalize方法

我發現了一些奇怪的東西。

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

爲什麼基類中有一個overriden方法呢?

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

我只是想知道在Object類中使用「protected Finalize」方法是什麼,以及它爲什麼得到編譯器的特殊處理?

回答

0

退房的MSDN到Object.Finalize

析構函數是執行清理操作的C#機制。析構函數提供適當的安全措施,例如自動調用基類型的析構函數。在C#代碼中,Object.Finalize不能被調用或覆蓋。

因此,你的問題的答案是:嗯 - 這是CLR內部的一部分; C#編譯器完成所有例如書寫時所需要的工作:

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

    } 
} 
4

它是在反射器中的錯誤,它就會通過這虛擬的,但不具備「newslot」屬性,並沒有一個方法混淆基類類型。將反編譯器切換到IL時可能會更容易看到。

終結真正的聲明,從參考源複製,是多少,你希望它是:

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

+1指出反射器的錯誤。我總是盲目地依靠它:)。在使用反射器時直接檢查IL是明智的。 – 2010-01-24 07:34:50

1

對於第二個問題,C#的~MyClass是寫在VB.NET作爲Protected Overrides Sub Finalize()這相當於protected override Finalize()。所以這只是C#語法的區別。

對於第一個問題,在反射器它是

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

相比於重寫被丟失newslot屬性通常看到的新的虛擬部件。

相關問題