c#的托管代码和非托管代码的理解
2021-02-19 08:17
.net的堆就是托管堆.没有非托管堆.引用类型的引用目标就是在堆里.
值类型的值就在栈里.
所谓的系统资源.是指:网络连接,数据库连接.文件流.这种东西.
这里的托管就是指被CLR管理,托管堆就是被CLR管理的堆。非托管资源需要手动释放,托管资源由GC帮你打理。
推荐园子里的一篇博文:对于托管资源和非托管资源的理解
我觉得你可以从using关键字入手,为什么我们有时候用
using(SqlConnection conn=new SqlConnection(constr))
{...}
using(Streamstreamwrite=new FileStream()
{...}
这种代码写数据库连接,对stream的操作。
就是因为这些资源是非托管资源无法被GC自动释放,需要手动强制释放,怎样使动释放呢?using就有这种功能,它可以跟踪非托管资源周期内的活动,一旦发现非托管资源生命结束了,就会强制调用dispose方法去释放在该作用域的非托管资源的内存。你去比较下java和.net垃圾回收机制和了解下C#值类型、引用类型、堆栈、托管堆的一些基础理论,然后把这些再联系起来想想应该能得到你想要的答案了,自己想明白的事情才能完全消化进去。