.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; // 标记已经被释放。
    }
  }