程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則18:實現標准的處理(Dispose)模式(2)

Effective C#原則18:實現標准的處理(Dispose)模式(2)

編輯:關於C語言

通過實現IDisposable 接口,你寫成了兩件事:第一就是提供了一個機制來及時的釋放所有占用的托管 資源(譯注:這裡就是指托管資源,當實現了這個接口後,可以通過調用Dispose 來立即釋放托管資源),另一個就是你提供了一個標准的模式讓用戶來釋放非托 管資源。這是十分重要的,當你在你的類型上實現了IDisposable接口以後,用 戶就可以避免析構時的損失。你的類就成了.Net社區中表現相當良好的成員。

但在你創建的機制中還是存在一些漏洞。如何讓一個派生類清理自己的 資源,同時還可以讓基類很好的再做資源清理呢?(譯注:因為調用Dispose方法 時,必須調用基類的Dispose,當然是在基類有這個方法時。但前面說過,我們 只有一個標記來標識對象是否處理過,不管先調用那個,總得有一個方法不能處 理這個標記,而這就存在隱患) 如果基類重載了析構函數,或者自己添加實現了 IDisposable接口,而這些方法又都是必須調用基類的方法的;否則,基類無法 恰當的釋放資源。同樣,析構和處理共享了一些相同的職責:幾乎可以肯定你是 復制了析構方法和處理方法之間的代碼。正如你會在原則26中學到的,重載接口 的方法根本沒有如你所期望的那樣工作。Dispose標准模式中的第三個方法,通 過一個受保護的輔助性虛函數,制造出它們的常規任務並且掛接到派生類來釋放 資源。基類包含接口的核心代碼, 派生類提供的Dispose()虛函數或者析構函數 來負責清理資源:

protected virtual void Dispose( bool isDisposing );

重載的方法同時完成析構和處理必須提供的任務 ,又因為它是虛函數,它為所有的派生類提供函數入口點。派生類可以重載這個 函數,提供恰當的實現來釋放它自己的資源,並且調用基類的函數。當

isDisposing為true時你可能同時清理托管資源和非托管資源,當 isDisposing為false時你只能清理非托管資源。兩種情況下,都可以調用基類的 Dispose(bool)方法讓它去清理它自己的資源。

當你實現這樣的模式時, 這裡有一個簡單的例子。MyResourceHog 類展示了IDisposable的實現,一個析 構函數,並且創建了一個虛的Dispose方法:

public class MyResourceHog : IDisposable
{
 // Flag for already disposed
 private bool _alreadyDisposed = false;
 // finalizer:
 // Call the virtual Dispose method.
  ~MyResourceHog()
 {
  Dispose( false );
 }
 // Implementation of IDisposable.
 // Call the virtual Dispose method.
 // Suppress Finalization.
 public void Dispose()
 {
  Dispose( true );
  GC.SuppressFinalize( true );
 }
 // Virtual Dispose method
 protected virtual void Dispose( bool isDisposing )
 {
  // Don't dispose more than once.
  if ( _alreadyDisposed )
    return;
  if ( isDisposing )
  {
   // TODO: free managed resources here.
  }
  // TODO: free unmanaged resources here.
  // Set disposed flag:
   _alreadyDisposed = true;
 }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved