关于GC的回收的疑问

wish907 2015-03-11 10:53:25
看了网上好多GC回收的,感觉越开越晕。
首先,GC的回收是回收托管资源,对于非托管资源需要手动释放。是这样吧。
想判断托管和非托管,感觉好像除了变量,每次用到的一些类都是非托管,
比如file的stream的 数据库的 response之类的搞得我每次都想要dispose了;
然后网上看到析构和dispose又有些茫然,因为自己使用是只是调用一个dispose
并没有说继承IDisposable重写dispose,然后关于析构的Finalize()好像是不建议使用的?
之前一段时间看到某人的java对比C#也才让我好好地了解了一下GC。
那么问题来了?
对于非托管资源的释放问题到底应该怎么样做才是最正确的。
...全文
119 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wish907 2015-03-11
  • 打赏
  • 举报
回复
引用 3 楼 SPFarm 的回复:
绝大多数的时候,都是托管的。 基本上是有遇到文件和数据库读写,需要dispose。 并不推荐手动调用关于析构的Finalize(),并且绝大多数情况下析构函数也是不需要写的。
那么是不是可以这么理解: 我创建一个数据库连接sql,使用好以后sql.close(),sql.dispose()就可以了 不需要去自己写dispose()
SPFarmer 2015-03-11
  • 打赏
  • 举报
回复
绝大多数的时候,都是托管的。 基本上是有遇到文件和数据库读写,需要dispose。 并不推荐手动调用关于析构的Finalize(),并且绝大多数情况下析构函数也是不需要写的。
於黾 2015-03-11
  • 打赏
  • 举报
回复
非托管资源也是GC去回收啊,只不过你需要手动调用Dispose通知GC可以对这个资源进行回收,GC自己判断不出来这东西是否还存在引用
  • 打赏
  • 举报
回复
非托管资源都是通过dispose释放啊,IDisposable只是约定了一个规范而已
於黾 2015-03-11
  • 打赏
  • 举报
回复
引用 4 楼 wish907 的回复:
[quote=引用 3 楼 SPFarm 的回复:] 绝大多数的时候,都是托管的。 基本上是有遇到文件和数据库读写,需要dispose。 并不推荐手动调用关于析构的Finalize(),并且绝大多数情况下析构函数也是不需要写的。
那么是不是可以这么理解: 我创建一个数据库连接sql,使用好以后sql.close(),sql.dispose()就可以了 不需要去自己写dispose() [/quote] 实际上你写close就足够了 只有你自己写dll的时候可能需要自己实现dispose,现有的类库保证都已经实现了,不需要自己再实现了
wish907 2015-03-11
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
非托管资源也是GC去回收啊,只不过你需要手动调用Dispose通知GC可以对这个资源进行回收,GC自己判断不出来这东西是否还存在引用
只需要简单的调用 dispose()就行了么,不需要考虑自己写dispose()内容吧

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧