A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© ivanz 中级黑马   /  2014-6-10 15:11  /  1374 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ivanz 于 2014-6-10 20:27 编辑

普通的引用类型是可以被GC回收的,但是为什么流类型GC不能自动回收啊?必须要dispose或者使用using....

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

3 个回复

倒序浏览
你这个问题可以思考,托管资源和非托管资源的概念
回复 使用道具 举报
       在.net 编程环境中,系统的资源分为托管资源和非托管资源。
  对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作。也就是说对于您的应用程序创建的大多数对象,可以依靠 .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。
  对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,否则会占用系统的内存和资源,而且可能会出现意想不到的错误。
最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果在MSDN Library 中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:
ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等资源。可能在使用的时候很多都没有注意到!

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报 2 0
qddnovo 发表于 2014-6-10 20:13
在.net 编程环境中,系统的资源分为托管资源和非托管资源。
  对于托管的资源的回收工作,是不需 ...

差不多明白点,谢谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马