由于最近在准备找工作,也从图书馆借了一本.net 程序员面试的“宝典”,本人一直也是不信什么程序员秘技、宝典,但是也不偏激,一本书至少是别人的经验的,多少还是能收益的。我也就利用零碎的时间常常翻阅看看的,看到关于析构函数和资源清理的时候,发现自己对里面的机制和原理不是很明白的,查阅一些资料后,写下自己的理解的。

C#的析构函数

与c++的析构函数不同,C#的析构函数并不在实例失效就调用。由于.net的垃圾回收机制,我们无法知道析构函数会在什么时候调用,而且我们也不能显式调用析构函数。我们只是知道,析构函数是在对象从托管的堆释放前的某个时刻调用。

所以,如果你的代码包含珍贵的资源(非托管资源,如:数据库的连接,画笔,句柄),别在析构函数里处理,因为你根本不知道析构什么时候能运行的。所以,我们必须想一直我们可以控制的办法,让我们可以准确的控制资源的释放,现在Dispose 方法登场,帮助我们完全控制什么时候我们释放非托管资源。

C#的析构函数与Finalize方法

C#析构函数在编译后产生的中间IL代码,我们通过Ildasm的反汇编程序,我们可以看不到C#的析构函数,只是多了一个Finalize方法,这个就是析构函数在CLR中的本来模样。在对象变为不可访问的时候,将自动调用Finalize方法。

Dispose方法代替Finalize方法的标准清理模式

通过Dispose方法我们可以自己显示的释放非托管资源。像数据库连接这种很稀少的资源,能得到充分利用。Dispose方法必须首先实现IDisposable接口,代码如下:

public class MyClass : IDisposable{private bool disposed = false;//Implement IDisposable.public void Dispose(){Dispose(true);GC.SuppressFinalize(this);//此处的调用,告诉垃圾回收器不要再调用析构函数
        }protected virtual void Dispose(bool disposing){if (!disposed){if (disposing){// 释放托管资源
                }//释放非托管资源disposed = true;}}~MyClass(){Dispose(false);}}

程序中的disposed作为标志位,为了防止在调用Dispse()方法后,析构函数调用时,再次释放资源。或者在有的时候,粗心的程序员在忘记调用Dispose()时,非托管资源在析构函数中也能得到释放。
  .NET框架里的标注清理模式

在.net的框架中的很多的地方都应用到标准清理模式,如数据库连接的释放,文件、流的释放。

public   void Close(){Dispose();}

关于垃圾回收机制

估计很多人会觉得我们需要关系垃圾回收机制吗?我觉得,应该了解一些机制的。我们在处理资源的时候,我们一般可以不关心垃圾回收机制,因为垃圾回收机制会帮我们优化内存回收。但是,涉及到非托管资源的时候,我们很关心时间的问题,此时我们如果能优化资源的利用问题的话,我们就提高很多程序的执行效率。

转载于:https://www.cnblogs.com/Johnnie/archive/2012/09/16/2687273.html

Finalize/Dispose资源清理模式相关推荐

  1. C++/CLI中的资源清理(Destructor,Finalizer)

    本文将分成三部分,他们分别是引言.Destructor,Finalizer的语法表示.如何保证Destructor,Finalizer与其他语言兼容.   一. 引言    资源是一个很大的范畴,先让 ...

  2. TPP多租户隔离之资源清理

      双11的时候TPP引入了ajdk多租户,对场景的cpu进行隔离,参考文章 <TPP稳定性之场景隔离和多租户>.文章中对tpp提供给算法方案的二方服务客户端进行改造,这些共享的二方服务注 ...

  3. Linux线程退出、资源回收、资源清理的方法

    首先说明线程中要回收哪些资源,理解清楚了这点之后在思考资源回收的问题. 1.子线程创建时从父线程copy出来的栈内存; 线程退出有多种方式,如return,pthread_exit,pthread_c ...

  4. C#笔记09 结构、枚举、异常、泛型、操作符重载、dll、垃圾回收与资源清理、XML注释

    文章目录 结构体struct 枚举enum 异常Exception 执行try最近的最贴切的catch 继承Exception以定义异常 泛型 泛型的约束where 操作符重载 类型转换操作符重载 d ...

  5. 【C#本质论 十一】合式类型(二)程序集引用、XML注释、垃圾回收和资源清理

    上一节介绍到了如何进行Object方法重写和操作符重载,本篇博客来接着介绍合式类型剩余的内容: 程序集引用及命名空间定义 其中一些相对简单的内容就不进行过多的介绍了,例如引用其他程序集,只需要注意三种 ...

  6. Metal 框架之资源存储模式

    概述 Metal 中使用 MTLStorageMode 来指定资源的内存位置和访问权限. MTLStorageMode 是个枚举类型,定义如下: public enum MTLStorageMode ...

  7. 抖音小店最终玩法,供应链资源整合模式《看到就是赚到》

    不管是做抖音小店无货源,还是我们自己做店铺自播,有一个感受特别明显,那就是: 直播带货背后拼的其实是供应链能力. 做过电商的人应该都懂. 尤其是在短时间大量爆单的情况下,没有靠谱的抖音小店供应链资源, ...

  8. Finalize,Dispose,SuppressFinalize

    MSDN建议按照下面的模式实现IDisposable接口: Code1 public class Foo: IDisposable2 {3 public void Dispose()4 {5 Disp ...

  9. Finalize/Dispose/Destructor

    我总是会搞混这些东西,还是写下来帮助记忆. Finalize 即Object.Finalize(),C#中不允许使用Finalize,析构器就等价于Finalize. Destructor 析构器(D ...

  10. Xilinx中时钟资源:模式时钟管理器(MMCM)的使用

    混合模式时钟管理器(MMCM) 除了丰富的时钟网络以外,Xilinx还提供了强大的时钟管理功能,提供更多更灵活的时钟.Xilinx在时钟管理上不断改进,从Virtex-4的纯数字管理单元DCM,发展到 ...

最新文章

  1. 如何迅速成长成为一名数据分析师(都是干货)?
  2. 第21届国际C语言混乱代码大赛获奖作品
  3. 面试官: 用css实现android系统的loading动画
  4. Thinkphp 数据库配置参数
  5. c语言中字符串数组应用,C语言中字符变量字符串和字符数组应用.doc
  6. #从零开始学Swift2.0# No.4 枚举, 元组, 数组和字典
  7. Android 系统(11)---android 系统权限大全
  8. [ BZOJ 3879 ] SvT
  9. c 连接mysql通用_用C语言操作MySQL数据库的通用方法
  10. POJ1015 Jury Compromise【背包问题】
  11. C++打卡18-【排序模板】计数排序
  12. 淘宝上大量贩卖微信号,这些人买这么多微信号目的是
  13. 互联网+房地产最后拼什么?除了技术还是技术
  14. AnySDK+GooglePlay对接1
  15. 一个人不自信有多可怕?
  16. python jit_Pypy Python的JIT实现
  17. 【Luogu5348】密码解锁(莫比乌斯反演,数论)
  18. 正则表达式中,如何在任意匹配字符后面加上原字符和特定内容
  19. linux 运行go文件路径,go程序部署到linux上运行-Go语言中文社区
  20. 决策树算法实现:泰坦尼克号乘客生存预测 (python实现)

热门文章

  1. 10种扼杀爱情的悲剧性格
  2. 《算法导论》第7章 快速排序 (四种变形)
  3. 支持一切积极向上的自发行为
  4. linux 安装weblogic12.1.3.0步骤
  5. 简单使用Spring Boot+JpaRepository+hibernate搭建项目
  6. CF1190E Tokitsukaze and Explosion 二分、贪心、倍增、ST表
  7. sql ,类型转换,日期截取格式
  8. SP1812 LCS2 - Longest Common Substring II
  9. linux 下 sudo 指令不需要输入密码的配置
  10. 设计模式之组合模式——Java语言描述