首页 新闻 会员 周边 捐助

对于托管资源和非托管资源的一点疑问

1
[待解决问题]

近期学习C#中的托管资源与非托管资源时遇到了问题。
一个博客里面说托管资源是.Net自动分配到托管堆上的资源。我知道C#有堆栈(stack)存储值类型,有堆(heap)存储引用类型。那么托管堆又是指什么?如何能快速辨别一种类型是托管资源还是非托管资源?

C#
KirinARM的主页 KirinARM | 初学一级 | 园豆:108
提问于:2018-01-19 00:00
< >
分享
所有回答(3)
0

能被自动回收的就是托管.不能被自动回收的就是非托管.

至于怎么判断就靠经验了.一般来说系统的东西就是托管的.

吴瑞祥 | 园豆:29449 (高人七级) | 2018-01-19 00:12

举个例子,string是托管资源,同时是引用类型。那么它还是存储在heap上吗?还是有专门存放托管资源的一块区域?难道所谓的托管堆就是值类型所在的堆栈和引用类型所在的堆的笼统的称呼?

支持(0) 反对(0) KirinARM | 园豆:108 (初学一级) | 2018-01-19 00:21

@Arixon: 不是托管堆和托管资源是2回事.

.net的堆就是托管堆.没有非托管堆.引用类型的引用目标就是在堆里.

值类型的值就在栈里.

所谓的系统资源.是指:网络连接,数据库连接.文件流.这种东西.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2018-01-19 00:31

@吴瑞祥 谢谢,我再认真体会一下。

支持(0) 反对(0) KirinARM | 园豆:108 (初学一级) | 2018-01-19 00:33
0

这里的托管就是指被CLR管理,托管堆就是被CLR管理的堆。非托管资源需要手动释放,托管资源由GC帮你打理。

推荐园子里的一篇博文:对于托管资源和非托管资源的理解

dudu | 园豆:30948 (高人七级) | 2018-01-19 09:53
0

我觉得你可以从using关键字入手,为什么我们有时候用

using(SqlConnection conn=new SqlConnection(constr))

{...}

using(Streamstreamwrite=new FileStream()

{...}

这种代码写数据库连接,对stream的操作。

就是因为这些资源是非托管资源无法被GC自动释放,需要手动强制释放,怎样使动释放呢?using就有这种功能,它可以跟踪非托管资源周期内的活动,一旦发现非托管资源生命结束了,就会强制调用dispose方法去释放在该作用域的非托管资源的内存。你去比较下java和.net垃圾回收机制和了解下C#值类型、引用类型、堆栈、托管堆的一些基础理论,然后把这些再联系起来想想应该能得到你想要的答案了,自己想明白的事情才能完全消化进去。

~扎克伯格 | 园豆:1923 (小虾三级) | 2018-01-19 10:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册