.NET 类所使用的释放未托管资源的两种方式:
1、
利用析构函数,此方法有很多问题
2、
实现IDisposable接口,但需要确保执行Dispose()方法
最好的情况是执行这两种机制,获得这两种机制的有点,克服其缺点。假定大多数程序员都能正确调用Dispose()方法,同时把析构函数做为一种安全机制,确保在没有调用Dispose()的情况下也能释放掉资源。

Public class Resourceholder:IDisposable
{
   Private bool isDisposed=false;

Public void Dispose()
    {
         Dispose(true);
         GC.SuppressFinalize(this);
    }

Protected virtual void Dispose(bool disposing)
{
         If(!isDisposed)
          {
               If(disposing)
                {
                     //通过调用托管对象的Dispose()方法释放托管对象
                }
                //释放未托管对象的代码
            //比如关闭数据库的连接,关闭文件句柄等
      }
      isDisposed=true;
}

~ResourceHolder()
   {
         Dispose(false);
   }

//其它的方法
}

Dispose()有一个protected的重载方法,带有一个bool类型的参数,这才是真正完成清理资源工作的方法,Dispose(bool)由析构函数个IDisposable.Dispose()调用。

传递给Dispose(bool)的参数表示Dispose(bool)是由析构函数调用(参数为false)还是由Dispose()调用(参数为true),并且Dispose(bool)不应该由其他方法调用。其原因是:

1、   如果客户调用了Dispose()方法,那么所有托管的和未托管的对象都会被清理

2、   如果没有调用Dispose()方法,析构函数迟早会被调用,该类所使用的资源仍然会被释放。

IsDisposed成员变量表示对象是否被删除。

最后IDisposeable.Dispose()包含一个对System.GC.SuppressFinalize()的调用,SuppressFinalize()方法告诉垃圾回收器有一个类不再需要调用析构函数,因为Dispose()已经完成了所有资源的回收,调用SuppressFinalize()就意味着GC认为这个对象没有析构函数

转载于:https://www.cnblogs.com/criedshy/archive/2011/01/14/1935524.html

.NET 内存管理与垃圾回收:实现IDisposable接口和析构函数相关推荐

  1. 详解JVM内存管理与垃圾回收机制2 - 何为垃圾

    随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...

  2. .NET基础 (05)内存管理和垃圾回收

    内存管理和垃圾回收 1 简述.NET中堆栈和堆的特点和差异 2 执行string abc="aaa"+"bbb"+"ccc"共分配了多少内存 ...

  3. 【转】.NET内存管理、垃圾回收

    ? .NET内存管理.垃圾回收 1. Stack和Heap     每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况.值类型变量(函数的参 ...

  4. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...

    17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...

  5. Python内存管理以及垃圾回收机制

    垃圾回收:用通俗点的语言解释就是内存管理和垃圾回收的过程. 大管家refchain 在Python的C源码中有一个名为refchain的环状双向链表,这个链表就比较厉害了,因为Python程序中一旦创 ...

  6. 详解JVM内存管理与垃圾回收机制5 - Java中的4种引用类型

    在Java语言中,除了基础数据类型的变量以外,其他的都是引用类型,指向各种不同的对象.在前文我们也已经知道,Java中的引用可以是认为对指针的封装,这个指针中存储的值代表的是另外一块内存的起始地址(对 ...

  7. python内存的回收机制_python的内存管理和垃圾回收机制详解

    简单来说python的内存管理机制有三种 1)引用计数 2)垃圾回收 3)内存池 接下来我们来详细讲解这三种管理机制 1,引用计数: 引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用 ...

  8. Go 内存管理与垃圾回收

    本文章主要从原理层面分析 Go 的内存管理和垃圾回收机制,包括堆内存.栈内存和垃圾回收等,对于源码的分析涉及较少,对源码有兴趣的朋友可以查看文末的参考链接进行查看,都是写的很好的文章,本文大部分都是从 ...

  9. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  10. Python的内存管理与垃圾回收机制

    在使用真格量化时,一些用户希望了解如何来提高系统性能.通过了解Python的内存管理和垃圾回收机制,我们可以有针对性地去提高策略代码性能. Python内存管理机制 Python的内存管理机制:引入计 ...

最新文章

  1. C#开发Unity游戏教程之Unity中方法的参数
  2. PyCharm中控制台输出日志分层级分颜色显示
  3. 图像处理之基于阈值模糊
  4. 2010年度报告:是谁在编写Linux内核?
  5. 联想笔记本电脑,重新安装系统之U盘启动方法
  6. C. Little Girl and Maximum Sum【差分 / 贪心】
  7. 算法分类整理+模板②:字符串处理
  8. 三星sd卡无法删除数据_单反相机里的SD卡在电脑中突然无法识别提示要格式化怎么办?...
  9. 每个努力奋斗过的人,被不公正的际遇砸了满头包的时候,都有那么一瞬间的代入感。出生就是hard模式的人,早已经历了太多的劳其筋骨饿其体肤,再多的人为考验只会摧毁人对美好的向往。...
  10. ElasticSearch 索引、更新和删除数据
  11. _Linux自编译云锁Web网站防火墙,看完小白也能保护网站安全
  12. Android Studio 3.4升级后的运行问题解决办法
  13. Powershell创建数组
  14. hive大字段拼接与切割实战(一个大字段保存每天历史数据)
  15. 跨界造智能机器人,娃哈哈能“喝”出新辉煌吗
  16. python3.8.1安装pandas_python中安装pandas
  17. 世界国旗/地图:世界各国国旗图标整理/与echarts世界地图配置对应
  18. Win10应用商店和UWP应用无法连接网络解决方法
  19. 扩展名为ifo的文件怎么播放
  20. 【脑洞大开】神经网络vs非公理化推理系统(NARS)

热门文章

  1. 李迟2021年10月知识总结
  2. xtragrid 某个值 查找_二分查找(下):如何快速定位IP对应的省份地址?
  3. 80-10-020-原理-Java NIO-HeapByteBuffer
  4. 【Elasticsearch】Elasticsearch 动态模板(Dynamic templates)
  5. 【Elasticsearch】玩转 Elasticsearch 7.8 的 SQL 功能
  6. 【Redis】Redis Hyperloglog
  7. 【clickhouse】Clickhouse 版本号历史
  8. 【registry】javax ValidationException: HV000183: Unable to load ‘javax.el.ExpressionFactory‘
  9. 95-130-410-源码-source-RabbitMQ相关-RabbitMQ Connector
  10. 【Spark】扩展Spark Catalyst,打造自定义的Spark SQL引擎