熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#清理非托管對象[2]

2013-11-13 12:16:09  來源: .NET編程 

  public class MyDerivedResource: MyResourceRelease
        {
            private bool _disposed = false;
            protected override void Dispose(bool isDisposing)
            {
                if(_disposed)
                {
                    return;
                }
                            try
                            {  
                                   if(isDisposing)
                                   {
                                          //釋放托管資源
                                   }
                                  //釋放非托管資源
                                _disposed = true;
                            }
                            finally
                            {
                       baseDispose(isDisposing);
                            }
            }
        }

  這樣可以確保釋放繼承鏈上所有對象的引用資源在整個繼承層次中傳播Dispose模式

  那用Dispose方式非托管資源就是最好的方法了嗎?

  其實不然因為類型實現了IDispose接口這個類的使用者必須顯示調用Dispose方法或者在創建該類型對象的時候使用using關鍵 字對於一些粗心的使用者可能會忘記調用Dispose方法或者沒有使用using關鍵字這樣就導致了非托管資源沒有釋放的後果

  最佳方案

  同時實現終結器和Dispose方式這樣對於細心的使用者直接顯示調用Dispose方法會提高垃圾回收的性能對於粗心的使用者雖然忘記了調用Dispose方法但也不至於使得非托管資源得不到釋放

  注意這裡用到了GC SuppressFinalize(this)方法

  代碼如下:

  public class MyResourceRelease: IDisposable
        {
                    ~MyResourceRelease()
                     {
                            Dispose(false);
                     }
                     /// 保證資源只用釋放一次
            private bool _alreadyDisposed = false;
                     /// 用來判斷釋放資源的類別(托管和非托管)
            protected virtual void Dispose(bool isDisposing)
            {
                if(_alreadyDisposed)
                {
                    return;
                }
               if(isDisposing)
                {
                    //釋放托管資源
                }
                //釋放非托管資源
                _alreadyDisposed = true;
            }
            public void Dispose()
            {
                Dispose(true);
                            //阻止GC把該對象放入終結器隊列
               GCSuppressFinalize(this);
            }
        }

[]  []  


From:http://tw.wingwit.com/Article/program/net/201311/15536.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.