知识大全 C#清理非托管对象[2]

Posted 资源

篇首语:一知半解的人,多不谦虚;见多识广有本领的人,一定谦虚。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#清理非托管对象[2]相关的知识,希望对你有一定的参考价值。

C#清理非托管对象[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  public class MyDerivedResource: MyResourceRelease                    private bool _disposed = false;            protected override void Dispose(bool isDisposing)                            if(_disposed)                                    return;                                            try                                                                  if(isDisposing)                                                                             //释放托管资源                                                                     //释放非托管资源                                _disposed = true;                                                        finally                                                   base Dispose(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把该对象放入终结器队列               GC SuppressFinalize(this);                   

cha138/Article/program/net/201311/15536

相关参考