C#资源回收总结
目前项目使用C#开发移动平台项目,温故而知新。
资源类型,总体分为三类:堆栈、托管堆、非托管资源
堆栈:内存原理先进后出,包含值类型和引用类型部分内容。
值类型-》它在释放资源的顺序上与定义变量时分配内存的顺序相反.值变量一旦出了作用域就会从堆栈中删除对象.
堆:引用类型
引用类型则存储在堆中.,当new一个类时,此时就会为对象分配内存存入托管堆中,它可以在方法退出很长的时间后仍然可以使用.我以一句常用的实例类的语句来说明下.
classA a=new classA();
这句非常平常的语句其实可以分成两部分来看:
第一:classA a;声明一个classA的引用a,在堆栈上给这个引用分配存储空间.它只是个引用,并不是真正的对象.它包含存储对象的地址.
第二:a=new classA();分配堆上的内存,以存储真正的对象.然后修改a的值为新对象的内存地址.
当引用出了作用域后,就会从堆栈上删除引用,但引用对象的数据仍然存储在托管堆中,一直到程序停止,或者是GC删除.
第三:Dispose
如果classA继承了IDispose,在调用Dispose方法后,程序仍然可以访问对象的原因了.Dispose对托管资源不起作用。
非托管资源:COM/COM++组件,ActiveX控件,API函数,WIN32,指针运算,自制的资源文件...这些的非托管的,其它就是托管的.
总结:C#非托管资源使用IDispose接口,托管资源不需要使用IDispose接口系统GC自动回收或者使用GC.Collect();
参考文章:
http://blog.sina.com.cn/s/blog_8abeac5b01019u19.html
http://bbs.csdn.net/topics/270000476