快速业务通道

对IDisposable接口的理解

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-04-10
的.它在托管资源上没有特别大的帮助.最终的资源回收工作还得要GC.我们看下托管资源和非托管资源在内存上的分配情况.

    /*非托管资源一般都是放在堆栈上,而托管资源都是存储在堆上.*/  非常感谢 Angel Lucifer的指教,本人见笑了 特此删除:
    

     值类型与引用类型在内存分配上的分别:

     值类型存储在堆栈中,堆栈的工作原理就是先进后出.它在释放资源的顺序上与定义变量时分配内存的顺序相反.值变量一旦出了作用域就会从堆栈中删除对象.
 
    引用类型则存储在堆中.,当new一个类时,此时就会为对象分配内存存入托管堆中,它可以在方法退出很长的时间后仍然可以使用.我以一句常用的实例类的语句来说明下.
    
    classA a=new  classA();
 
    这句非常平常的语句其实可以分成两部分来看:

    第一:classA a;声明一个classA的引用a,在堆栈上给这个引用分配存储空间.它只是个引用,并不是真正的对象.它包含存储对象的地址.
    第二:a=new classA();分配堆上的内存,以存储真正的对象.然后修改a的值为新对象的内存地址.

    当引用出了作用域后,就会从堆栈上删除引用,但引用对象的数据仍然存储在托管堆中,一直到程序停止,或者是GC删除.

    所在这点就可以解释我上面写的Foo类在调用Dispose方法后,程序仍然可以访问对象的原因了.

    /*我认为堆是否就有像asp.net中的缓存功能,它可以将对象缓存起来,对象只要创建一次就可以在一定的有限时间内存在.*/
    非常感谢 Angel Lucifer的指教 特此更正如下:
    这种情况完全是因为GC回收操作的不可预测性导致的。GC Heap上的对象生存期完全看GC是否要回收它而决定。此外,值类型完全没必要实现 IDisposable 接口。
 
    总结:
          如果你的类中没有用非托管资源,或者是非常大的实例(象 GIS 中的Geometry), 就没有太大的必要实现这个接口. 并不是实现了这样的接口就说明你写的类有多大的不同或者会带来多大的性能优势. 

    本人对IDisposable接口就限于此,如果园友们有更多更好的理解都可以指教.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号