码迷,mamicode.com
首页 > Web开发 > 详细

.NET Dispose模式的实现

时间:2018-12-21 16:56:27      阅读:310      评论:0      收藏:0      [点我收藏+]

标签:派生类   任务   isp   obj   some   turn   att   模式   net   

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

 

.NET Dispose模式的实现

标签:派生类   任务   isp   obj   some   turn   att   模式   net   

原文地址:https://www.cnblogs.com/WinHEC/p/Dispose_Pattern_In_CSharp.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!