.net的GC机制有两个问题:首先GC并不能释放所有资源,它更不能释放非托管资源。其次,GC也不是实时的,所有GC存在不确定性。
为了解决这个问题donet提供了析构函数

public class TestClass : System.IDisposable
{//供程序员显式调用的Dispose方法public void Dispose(){//调用带参数的Dispose方法,释放托管和非托管资源Dispose(true);//手动调用了Dispose释放资源,那么析构函数就是不必要的了,这里阻止GC调用析构函数System.GC.SuppressFinalize(this);}//protected的Dispose方法,保证不会被外部调用。//传入bool值disposing以确定是否释放托管资源protected void Dispose(bool disposing){if (disposing){///TODO:在这里加入清理"托管资源"的代码,应该是xxx.Dispose();
        }///TODO:在这里加入清理"非托管资源"的代码
    }//供GC调用的析构函数~TestClass(){Dispose(false);//释放非托管资源
    }
}

而即使我们忘记了在合适的时候调用Dispose,GC也会在释放对象的时候帮我们清理非托管资源的。GC所充当的角色只是一种保障手段,它应该充当这种角色,我们不能过分依赖它。实际上,在较大的模块退出时我们还应该及时地手动调用GC.Collect进行垃圾回收。

为什么实现IDisposable接口的类的对象,因为.net CLR是采用GC(垃圾回收器)机制管理内存,不想C++语言那样,能保证对象的析构函数在作用域结束时被总是被自动调用,有时如果程序运行的过程中一直没有满足启动GC的条件,则可能GC一次也没启动。 这样,如果一个类需要占用重要资源,就应该实现IDisposable接口,或者使用另一种简捷的方式:使用Using,如:

Using(MyClass myObj = new MyClass())

{ ... }

对于没有实现IDisposable接口的,也就没什么Dispose方法,但他们的Finalize同样不能保证被调用。

Using(MyClass myObj = new MyClass())

{ ... }

是一种好方法,但是只有MyClass实现了IDisposable接口才能这样写.

C#实现IDispose接口相关推荐

  1. OOP设计思考——何时使用接口?

    一."接口"初步: 从OOP设计角度来分析,"接口"是一个很特殊的"类",特殊之处在于: 1)不能为接口中定义的方法添加关键字(只允许是pu ...

  2. .net每隔几秒去请求接口 怎么做_C# .net 中 Timeout 的处理及遇到的问题

    C# 中 Timeout 的处理 前言 最近在项目中要实现一个功能,是关于 Timeout 的,主要是要在要在 TCP 连接建立的时间 和 整个请求完成的时间,在这两个时间层面上,如果超出了设置的时间 ...

  3. 利用IDisposable接口构建包含非托管资源对象

    托管资源与非托管资源 在.net中,对象使用的资源分为两种:托管资源与非托管资源.托管资源由CLR进行管理,不需要开发人员去人工进行控制,.NET中托管资源主要指"对象在堆中的内存" ...

  4. 【转】堆栈和托管堆 c#

    原文地址:http://blog.csdn.net/baoxuetianxia/archive/2008/11/04/3218913.aspx 首先堆栈和堆(托管堆)都在进程的虚拟内存中.(在32位处 ...

  5. .net内存管理与指针

    本人前段时间准备做个TIN三角网的程序,思想是是分割合并法,分割的同时建立平衡二叉树,然后子树建三角网并相互合并,再向上加入父亲的点集.由于我对.net语言熟点,就准备用c#语言实现.但是不知从那听过 ...

  6. .NET深入学习笔记(3):垃圾回收与内存管理

    今天抽空来讨论一下.Net的垃圾回收与内存管理机制,也算是完成上个<WCF分布式开发必备知识>系列后的一次休息吧.以前被别人面试的时候问过我GC工作原理的问题,我现在面试新人的时候偶尔也会 ...

  7. c#_Task用法总结

    目录 Task与Thread Task的用法 1.创建任务 2.async/await的实现方式 3.task可以同步执行吗? 4.Task的Wait.WaitAny.WaitAll方法介绍 5.释放 ...

  8. .Net Discovery 系列之四--深入理解.Net垃圾收集机制(下)

    上一节给大家介绍了 .Net GC的运行机制,下面来讲下与GC相关的重要方法. 第二节.GC关键方法解析 1.Dispose()方法 Dispose可用于释放所有资源,包括托管的和非托管的,需要自己实 ...

  9. VBA Editor Addins -- VBE插件模板开发众筹

    https://www.cnblogs.com/Charltsing/p/VBEAddins.html QQ:564955427 8月8日测试版功能说明 1.VBE菜单的创建 2.toolwindow ...

最新文章

  1. textview字体切换颜色_百元耳机支持主从切换,关键双耳双麦还能立体降噪
  2. Python 解释器中使用help()命令如何退出
  3. 使用RegistryKey的一个注意点
  4. java每个月某天,java – 查找一年中的某一天
  5. spring-第六篇之创建bean的3种方式
  6. Java语言程序设计(基础篇)课后答案
  7. 专门查英语单词的软件_有什么软件可以查英语单词
  8. https://acs.jxnu.edu.cn/problem/GYM103495E
  9. php adc类,Maxim:六种主流ADC架构的比较(SAR,Sigma-Delta,Pipelined等)
  10. C语言,指针变量的*p,p以及p的区别
  11. 文件操作细致详解(下)
  12. bugku:简单的套娃
  13. Newcoder Wannafly13 B Jxy军训(费马小定理、分数在模意义下的值)
  14. 网络会计信息失真的风险及对策
  15. 幂律分布的参数估计方法及R实现
  16. Page和PageInfo
  17. oracle 税,【oracle】个人所得税公式
  18. 微信小程序真机调试问题
  19. 【Linux】Linux入门学习之常用命令一
  20. 带孩子们做环球旅行的读后感_带着孩子必须要做的5件事,你做了几件

热门文章

  1. 普惠AI,将是开发者下一个风口吗?看看他们怎么说
  2. 谷歌开源了量子算法框架CIRQ,拥抱NISQ新时代
  3. 纯新手入门机器/深度学习自学指南(附一个月速成方案)
  4. Oracle收购Talari,第一家SD-WAN公有云提供商出现
  5. LoadRunner使用odbc时报错can't get hostname for your address的解决方法
  6. 最简单的嵌套循环,一句话即可。适合repeater,dropdownlist,gridview等等
  7. ASP.NET MVC5总结(二)@HTML扩展
  8. Nagios配置和命令介绍(二 )
  9. 阿里云免费试用之体验——阿里云serverECS试用心得
  10. 深度解析~iOS应用程序~生命周期