.NET Dispose模式的實現

/// <summary>
  /// Dispose Pattern
  /// </summary>
  /// <remarks>
  /// 由邏輯可知:
  /// 1.不管是手動調用Dispose方法還是系統自動調用析構函數,均會執行【非託管資源】釋放程序
  /// 2.系統自動調用析構函數時,不會執行【託管資源】釋放程序
  /// </remarks>
  public class DisposableObject : IDisposable
  {
    /// <summary>
    /// 獲取或設置一個值。該值指示資源已經被釋放。
    /// </summary>
    private bool _disposed;

    /// <summary>
    /// 執行與釋放或重置非託管資源相關的應用程序定義的任務。
    /// </summary>
    public void Dispose()
    {
      Dispose(true);

      // 指示GC不要調用此對象的Finalize方法
      GC.SuppressFinalize(this);
    }

    /// <summary>
    /// 關閉此對象使用的所有資源。
    /// </summary>
    /// <remarks>
    /// 1.有時候特定的名稱比Dispose更合適,比如文件封裝,網絡連接封裝等
    /// 2.此方法不要設計爲 virtual,子類不應該重寫該方法。
    /// </remarks>
    public void Close()
    {
      Dispose();
    }

    /// <summary>
    /// 由終結器調用以釋放資源。
    /// </summary>
    ~DisposableObject()
    {
      Dispose(false);
    }

    public void DoSomething()
    {
      if (_disposed) throw new ObjectDisposedException("無法訪問已經釋放的資源。");
      // TODO somethings
    }

    /// <summary>
    /// 執行與釋放或重置非託管資源相關的應用程序定義的任務。
    /// 派生類中重寫此方法時,需要釋放派生類中額外使用的資源。
    /// </summary> 
    protected virtual void Dispose(bool disposing)
    {
      if (_disposed)
      {
        return;
      }

      if (disposing)
      {
        // TODO 清理託管資源 
      }

      // TODO 1.清理非託管資源  2.將大對象設置爲null

      _disposed = true; // 標記已經被釋放。
    }
  }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章