知识大全 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

相关参考

知识大全 c#中dllimport报错

  c#使用dllimport调用c++生成的dll库文件报错  报错信息为  对PInvoke函数xxx的调用导致堆栈不对称原因可能是托管的PInvoke签名与非托管的目标签名不匹配请检查PInvo

知识大全 .net中非托管资源如何清理

  背景这两天帮助其它项目组Review代码发现有些地方实现了IDispose接口同时也发现了一些关于IDispose的问题:        

知识大全 调用非托管dll常出现的bug及解决办法

  C和C++有很多好的类库的沉淀在NET中完全抛弃它们而重头再来是非常不明智的也是不现实的所以我们经常需要通过Pinvoke来使用以前遗留下来的非托管的dll就NET中使用非托管的dll经验而言经常

知识大全 C++/CLI中有效使用非托管并列缓存

C++/CLI中有效使用非托管并列缓存  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!VisualS

知识大全 ASP.NET技巧:非托管COM组件的使用

ASP.NET技巧:非托管COM组件的使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  众所周

知识大全 了解C#特性:对象集合初始化器[2]

了解C#特性:对象集合初始化器[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  后来我发现我

知识大全 C#开源轻量级对象数据库NDatabase介绍[2]

C#开源轻量级对象数据库NDatabase介绍[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 叩开C#之门系列之C#与面向对象编程语言

叩开C#之门系列之C#与面向对象编程语言  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#是纯

知识大全 用C#创建COM对象

用C#创建COM对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在本篇文章中我们将讨论下面的

知识大全 C#数组排序与对象大小比较

C#数组排序与对象大小比较  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &