2015-03-02 60 views
3

MS建議基類應在派生類中提供protected virtual void Dispose(bool disposing)。我有一個更早寫的現有類,它不提供這樣的功能。通過知道事實基類是Disposable,我們可以簡單地在任何派生類中使用以下內容嗎?不提供受保護的Dispose(bool)方法的基類?

class Base : IDisposable 
{ 
    //This somehow disposes it's resources 
} 

class Derived : Base 
{ 
    bool disposed; 
    private void PrivateDispose(bool disposing) 
    { 
     if (disposed) return; 
     if (disposing) { 
      // Cleanup managed resources 
      // ... 

      // Simply dispose base class 
      base.Dispose(); 
     } 
     // Cleanup unmanged resources if any 
     // ... 

     disposed = true; 
    } 

    public void Dispose() 
    { 
     PrivateDispose(true); 
     GC.SuppressFinalize(this); 
    } 

    // Only provide Finalizer if we have unmanaged resources 
    ~Derived() 
    { 
     PrivateDispose(false); 
    } 
} 
+0

爲什麼你會在.NET 2.0及更高版本中使用該模式? – CodesInChaos 2015-03-02 11:43:16

回答

3

是的,你可以。 MS建議這樣做的原因是爲了讓派生類型的任何實施者輕鬆覆蓋現有的Dispose(bool disposing)方法,因爲由IDisposable接口實現的public void Dispose()不是virtual

請注意,您應該使用此模式。更改:

private void PrivateDispose(bool disposing) 

要:

protected virtual void Dispose(bool disposing) 

所以如果有人可能需要延長課上,他可以簡單地重寫你的方法。

一般來說,here are some more guidelines for implementing IDisposable

處置應符合下列條件:

1)安全地調用多次
2)釋放與實例
3)呼叫相關的任何資源 基類的Dispose方法, 如有必要
4)抑制此類的定稿以幫助GC通過 減少t他 定稿隊列上的對象數量。
5)Dispose通常不應該拋出異常,除非非常嚴重的 錯誤是特別意外的(即OutOfMemoryException)。 理想情況下,通過調用Dispose,您的對象不應該出問題。