Net如何继承IDisposable接口,实现自己的Dispose()函数

如何预防Net下的资源泄露呢?有一种方法就是继承IDisposable接口,再对继承中的所有实例递归地调用Finalize方法。
  (1)一个原则:资源在哪个类中被创建就应该在哪个类中清理。如果类中调用了其他基类中创建的资源,则应在基类中删除这些资源。
  (2)析构函数:
  析构函数是由垃圾回收器(GC)在清理对象时调用的。  
  因为.NET中的托管对象都是由垃圾回收器自动定期清理的,所以如果一个类中只有托管对象,则垃圾回收器在回收该对象时会同时一次性清理掉该类中创建的托管对象,此种情况下不要编写析构函数(情况A)。
  如果一个类中创建使用了非托管资源(如数据库连接)(情况B),此时应该使用析构函数,但也只是作为忘记调用Dispose()函数的一种备份机制。换言之,此时,应该先掉用Dispose()函数来删除资源。
  (3)Dispose()函数:
  在上面的情况A中,可以不调用Dispose()函数。但如果类中创建使用过一些较大的托管对象,最好尽快清除它们,此时可以在Dispose函数中删除它们,并由用户调用以尽快删除它们。
  在情况B中,应该在Dispose()中删除非托管资源,并由用户调用Dispose()。此时,为防止垃圾回收器再次调用析构函数,应该在Dispose()中调用GC.SuppressFinalize(this)通知垃圾回收器,此对象已经不再需要执行析构函数以免重复执行。但如果用户忘记了调用Dispose(),则垃圾回收器仍然会执行析构函数,保证非托管资源会被清除。
具体实现方法参见下文例子:
  public class MyClass():IDisposable
  {
        private StreamReader sr;
        private int connection;
        ......
        public void Dispose()
        {
              Dispose(true);
              GC.SuppressFinally(this);
          }

          protected virtual void Dispose(bool disposing)
          {
                  if(disposing)
                  {     //清理托管对象
                        if(sr!=null)
                        {
                              sr.Close();
                              sr=null;
                          }
                  }
                //清理非托管对象
                CloseConnection();//假设类中有这样一个函数用于清理DB连接这个非托管资源 
            }

            ~MyClass()
            {
                  Dispose(false); //仅仅清理非托管资源,除此外不应编写其它代码。
              }
            .....
  }
另外有一点,不应该重写Finalize()函数。按照面向对象的原理来看,如果你重写了一个基类函数但没有使用override,它将隐藏基类中的函数,可能产生非预期的结果与冲突。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yuanhuiqiao/archive/2009/07/30/4389729.aspx

posted @   94cool  阅读(251)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
< 2010年3月 >
28 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 1 2 3
4 5 6 7 8 9 10
点击右上角即可分享
微信分享提示