关键是要了解CLR(公共语言运行时)
.Net Framework 是由彼此独立又相关的两部分组成:CLR 和 类库, CLR是它为咱们提供的服务,类库是它实现的功能. .NET的大部分特性----垃圾收集,版本控制,线程管理等,都使用了CLR提供的服务
当你为.NET Framework编译源代码的时候,获得的目标代码不是CPU能识别的机器指令,而是一种叫作"微软中间语言(MSIL,或简称为IL的代码)"的新语言.CLR提供了一个实时编译器,用来把IL代码编译为本机机器代码.这样一来,CLR可以使代码变得可移植,由于.NET应用程序的源代码必须被编译为IL代码,这些IL代码能够运行在任何提供CLR服务的平台上.从CLR的角度来看,全部的语言都是平等的,只要有一个能生成IL代码的编译器就行,这就确保了各类语言的互操做性.
为CLR而编写以及使用CLR服务的代码叫"托管代码",而那些未使用CLR服务的代码(也就是你多年以来一直编写的代码)叫"非托管代码".
讨论到C++在.NET托管环境中的应用,因为C++不是为.NET平台设计的语言,因此,微软须要对C++做一些扩充,这就引入了"托管扩展"这一律念,它容许咱们在C++项目中使用.NET Framework,若是有下列开发须要,就必须使用托管扩展:
1. 将现有的C++代码移植到托管环境中
2. 在C++代码中访问.NET Framework类
3. 经过.NET语言访问现有的C++代码 编程
托管代码是一种相似于JAVA虚拟机相似的代码,但与JAVA虚拟机不一样,它的执行效率仍是很是好,它被叫作IL码,或是MSIL码,即中间码的意思
非托管代码就是本地代码的意思,就是说在执行时是直接送往CPU的, 网络
COM/COM++组件,ActiveX控件,API函数,指针运算,自制的资源文件...这些的非托管的,其它就是托管的.ide
对于托管的资源的回收工做,是不须要人工干预回收的,并且你也没法干预他们的回收,所可以作的只是了解.net CLR如何作这些操做。也就是说对于您的应用程序建立的大多数对象,能够依靠 .NET Framework 的垃圾回收器隐式地执行全部必要的内存管理任务。
函数
对于非托管资源,您在应用程序中使用完这些非托管资源以后,必须显示的释放他们,例如System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,不然会占用系统的内存和资源,并且可能会出现意想不到的错误。
性能
我想说到这里,必定要清楚什么是托管资源,什么是非托管资源了?
url
最多见的一类非托管资源就是包装操做系统资源的对象,例如文件,窗口或网络链接,对于这类资源虽然垃圾回收器能够跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net Framework提供了Finalize()方法,它容许在垃圾回收器回收该类资源时,适当的清理非托管资源。若是在MSDN Library 中搜索Finalize将会发现不少相似的主题,这里列举几种常见的非托管资源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReaderspa
,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等资源。可能在使用的时候不少都没有注意到!
操作系统
关于托管资源,就不用说了撒,像简单的int,string,float,DateTime等等,.net中超过80%的资源都是托管资源。
.net
非托管资源如何释放,.NET Framework 提供 Object.Finalize 方法,它容许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源。默认状况下,Finalize 方法不执行任何操做。默认状况下,Finalize 方法不执行任何操做。若是您要让垃圾回收器在回收对象的内存以前对对象执行清理操做,您必须在类中重写 Finalize 方法。然而你们均可以发如今实际的编程中根本没法override方法Finalize(),在C#中,能够经过析构函数自动生成 Finalize 方法和对基类的 Finalize 方法的调用。线程
例如:
~MyClass()
{
// Perform some cleanup operations here.
}
该代码隐式翻译为下面的代码。
protected override void Finalize()
{
try
{
// Perform some cleanup operations here.
}
finally
{
base.Finalize();
}
}
可是,在编程中,并不建议进行override方法Finalize(),由于,实现 Finalize 方法或析构函数对性能可能会有负面影响。一个简单的理由以下:用 Finalize 方法回收对象使用的内存须要至少两次垃圾回收,当垃圾回收器回收时,它只回收没有终结器(Finalize方法)的不可访问的内存,这时他不能回收具备终结器(Finalize方法)的不能够访问的内存。它改成将这些对象的项从终止队列中移除并将他们放置在标记为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收器进行回收时,就回收并释放了这些内存。
摘自:http://wenku.baidu.com/link?url=LGTBo9u4d0QOC38bJTO5WEjK_WIR_ahLXuNXYscDgkKysaTfueWAM5Qn7eV7AX2S67iEc8B1jQLTTuKEp-DEmBGEkirXRCIiS8fz09BWUXm