什么是托管资源和非托管资源

yangxinglouis 2009-01-07 10:20:03
自己查了资料是这样说的
(1)托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。
(2)非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源 等,这些资源一般情况下不存在于Heap(内存中用于存储对象实例的地方)中。

不太理解。
比如流SqlConnection conn = new SqlConnection(connStr); 数据库连接不也是我new出来的吗,为什么它就属于非托管资源?

非托管资源不会被垃圾回收器自动回收,是不是我要写个额外的方法释放他们?

谢谢各位!
...全文
256 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lily_0629 2011-07-04
  • 打赏
  • 举报
回复
学习了,谢谢各位
yangxinglouis 2009-01-07
  • 打赏
  • 举报
回复
谢谢各位
CruelYoung123 2009-01-07
  • 打赏
  • 举报
回复
托管 可以自动管理。
yanlongwuhui 2009-01-07
  • 打赏
  • 举报
回复
关注
siecj 2009-01-07
  • 打赏
  • 举报
回复
.NET程序运行时,创建的对象都会分配在托管堆(HEAP)上。
托管堆是.NET FRAMEWORK维护的一块内存空间,分配在其中的对象,FRAMEWORK会负责资源释放等工作。托管资源指的就是这部分。
许多的系统资源则不在托管堆中,比如SqlConnection, File等。这些资源不受FRAMEWORK控制,因此它们的释放工作就要手动完成,比如:Close()。这部分就叫做非托管资源。
不知道我说的是否清楚,希望有所帮助。
i0876 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 IcyPlayer 的回复:]
SqlConnection conn = new SqlConnection(connStr);
的确是你new出来的,但是CLR不能决定什么时候释放,因为sql连接可能是tcp,udp,管道连接,只有你想让这个连接段开的时候,才能断开,同理socket也是非托管资源,你监听了一个端口,你必须手动调用Close(),关闭连接,否则CLR不会帮你释放
[/Quote]

原来CLOSE的意思就是要自己释放资源啊,学习了。
mawering 2009-01-07
  • 打赏
  • 举报
回复
帮顶了!跟着学习一下!
yangwei644 2009-01-07
  • 打赏
  • 举报
回复
不错 学习了
xugh 2009-01-07
  • 打赏
  • 举报
回复
也碰到过这样的问题,学习一下
koukoujiayi 2009-01-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 IcyPlayer 的回复:]
SqlConnection conn = new SqlConnection(connStr);
的确是你new出来的,但是CLR不能决定什么时候释放,因为sql连接可能是tcp,udp,管道连接,只有你想让这个连接段开的时候,才能断开,同理socket也是非托管资源,你监听了一个端口,你必须手动调用Close(),关闭连接,否则CLR不会帮你释放
[/Quote]
正解哦!!
IcyPlayer 2009-01-07
  • 打赏
  • 举报
回复
SqlConnection conn = new SqlConnection(connStr);
的确是你new出来的,但是CLR不能决定什么时候释放,因为sql连接可能是tcp,udp,管道连接,只有你想让这个连接段开的时候,才能断开,同理socket也是非托管资源,你监听了一个端口,你必须手动调用Close(),关闭连接,否则CLR不会帮你释放
skeljy 2009-01-07
  • 打赏
  • 举报
回复
mark 不是很了解~ 帮你顶~

111,130

社区成员

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

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

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