日期:2014-05-20  浏览次数:21153 次

[整理贴]托管代码/非托管代码及托管资源/非托管资源的扫盲帖
说明:刚刚回了一个帖子,有人问是不是所有的类在不用时调用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()方法的。

------解决方案--------------------
bd
------解决方案--------------------
搬条凳子慢慢看
------解决方案--------------------
学习了
------解决方案--------------------
顶,学习了。
------解决方案--------------------
感谢楼主 学习了~
------解决方案--------------------
up
------解决方案--------------------
学习!
------解决方案--------------------
写的很棒
------解决方案--------------------
不错不错!学习啦
------解决方案--------------------
赶紧占座
写得真是详细啊!3Q!
------解决方案--------------------
搬个凳子来学习……
------解决方案--------------------
好长啊~~~~~
------解决方案--------------------
还看过LZ的视屏教程,讲的很好啊
------解决方案--------------------
了解
------解决方案--------------------