[整理贴]托管代码/非托管代码及托管资源/非托管资源的扫盲帖

周公
博客专家认证
2009-10-29 08:54:22
加精
说明:刚刚回了一个帖子,有人问是不是所有的类在不用时调用Dispose()方法就能及时释放内存,感觉好像以前也有朋友问过我这样的问题,于是将网上的资料结合个人理解整理了一下,作为一个托管代码/非托管代码及托管资源/非托管资源的扫盲帖吧。
==============================================================================================================
 托管代码 (managed code)
由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。

  在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。


非托管代码 (unmanaged code)

  在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。

.net中托管代码的含义

问题:什么是托管?托管是什么意思?

托管代码就是基于.net元数据格式的代码,运行于.net平台之上,所有的与操作系统的交换有.net来完成,就像是把这些功能委托给.net,所以称之为托管代码。非托管代码则反之。
==============================================================================================================
托管资源

与托管代码密切相关的是托管资源。托管资源是由公共语言运行的垃圾回收器进行分配和释放的数据。默认情况下,C#、Visual Basic 和 JScript.NET 数据是托管资源。不过,通过使用特殊的关键字,C# 数据可以被标记为非托管资源。Visual C++数据在默认情况下是非托管数据,即使在使用 /CLR 开关时也不是托管的。

关于托管资源,就不用说了撒,像简单的int,string,float,DateTime等等,.net中超过80%的资源都是托管资源。

非托管资源
 对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如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 等等资源。可能在使用的时候很多都没有注意到!

在.NET中很多托管资源都实现了IDisposable接口,这个接口只有一个待实现的方法Dispose(),在上面提到的类中大都有这个方法,此外还有些类除了调用Dispose()方法可以释放资源之外,还可以调用Close()方法释放资源,比如各类数据库连接(Connection)、各种流(Stream),在调用Close()方法时会自动调用Dispose()方法的。
...全文
2787 106 打赏 收藏 转发到动态 举报
写回复
用AI写文章
106 条回复
切换为时间正序
请发表友善的回复…
发表回复
mishidemayi 2011-06-30
  • 打赏
  • 举报
回复
学习了
softjet 2011-06-27
  • 打赏
  • 举报
回复
好帖收藏,那是必须的!
liuyilin999 2010-11-23
  • 打赏
  • 举报
回复
感谢楼主 学习了
scorpiogoo 2010-11-18
  • 打赏
  • 举报
回复
在实际应用中,总觉得托管效率不高
szu_john 2010-10-19
  • 打赏
  • 举报
回复
好贴,学习了!
巴朗鱼 2010-04-14
  • 打赏
  • 举报
回复
很好很强大,学到了不少,谢谢LZ。
youling521 2010-04-13
  • 打赏
  • 举报
回复
好好学习,,,谢谢楼主
chenglovem 2010-04-12
  • 打赏
  • 举报
回复
好 支持一下,收藏了
masky5310 2010-04-12
  • 打赏
  • 举报
回复
MARK
menggang9801 2009-12-30
  • 打赏
  • 举报
回复
顶一个
ylwqhr 2009-12-28
  • 打赏
  • 举报
回复
收藏,学习!~
redvipabc 2009-12-25
  • 打赏
  • 举报
回复
扫盲了
hectorwy 2009-12-25
  • 打赏
  • 举报
回复
迷迷糊糊
pkyouxilgj 2009-12-25
  • 打赏
  • 举报
回复
好文章,值得一看
zqtoo 2009-12-25
  • 打赏
  • 举报
回复
````飘过````祝大家圣诞快乐!
abcd111111zhu 2009-12-25
  • 打赏
  • 举报
回复
学习中
辉太郎 2009-11-02
  • 打赏
  • 举报
回复
收藏了
VistaKobe 2009-11-02
  • 打赏
  • 举报
回复
学习~!!!!!
dxw075 2009-11-02
  • 打赏
  • 举报
回复
收藏。。。慢慢学习!
oasistree 2009-11-01
  • 打赏
  • 举报
回复
学习了,谢谢!
加载更多回复(86)

110,572

社区成员

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

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

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