.net中所有托管资源均有GC自动回收,那非托管资源怎么办呢?

IDisposable接口就是设计用来显示释放非托管资源,如果是直接调用dispose方法,则无需再经由finalizer方法去调用this.Dispose(false)去释放托管资源,所以需在Dispose()方法中加上

GC.SuppressFinalize(this);
以提醒系统无需再调用析构函数,所有托管、非托管资源均会在Dispose(True)方法中释放,否则仍由Finzlizer方法调用Dispose(false)方法以便释放非托管资源,托管资源由GC直接回收
  public class MyBaseResourceManager : IDisposable
    {
        // Dispose是否被调用
        private bool isDisposed = false;
        protected string Name = "Name";
       
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!isDisposed)
            {
                if (disposing)
                {
                    //Code to 释放托管资源
                }
                //Code to 释放非托管资源
            }
            isDisposed = true;
        }
        // 析构函数只会在我们没有直接调用Dispose方法的时候调用
        // 派生类中不用在次提供析构函数
        ~MyBaseResourceManager()
        {
            Dispose(false);
        }
    }

    public class MyResourceManager : MyBaseResourceManager
    {
        private bool disposed = false;
      
        protected override void Dispose(bool disposing)
        {
            if (!disposed)
            {
                try
                {
                    if (disposing)
                    {
                        //Code To 释放托管资源
                    }
                    //Code To 释放非托管资源
                }
                finally
                {
                    base.Dispose(disposing);
                }
            }
            
        }
    }

使用Using关键字,即可在using中代码执行结束后自动调用对象mr的dispose方法,如下所示

static void Main()
        {
            using (MyResourceManager mr = new MyResourceManager())
            {
            }

 参见:http://www.cnblogs.com/carysun/archive/2008/06/15/Dispose.html

posted on 2013-04-19 11:12  赶路人之刚出发  阅读(475)  评论(0编辑  收藏  举报