托管代码
一旦你将你的代码编译成MSIL,CLR这个角色就一直存在,而JIT编译器将会把它编译为本地代码。使用.NET Framework编写的代码在它被运行的时候是托管的(通常涉及到运行周期库)。这意味着CLR将为你的应用管理内存,处理安全,允许混合语言调试等等。相反的,没有在CLR控制下运行的应用被称为未托管的,而确定的语言比如C++可以被用于编写这些应用,比如,举个例子,使用操作系统的底层函数。但是,在C#中你只能编写在托管环境下的代码。你可以利用CLR的托管特点来允许.NET它本身来控制和计算机的交互。
垃圾回收
托管代码的最重要的特性之一就是垃圾回收的概念。这是这是.NET确保不再使用的程序的内存能够被完全的释放的方法。在.NET之前这主要是程序员的责任,然而由于在内存中被分配到错误的地址,代码的一个简单错误能够导致一大块内存莫名其妙的消失。这通常意味着你电脑性能大幅度的下降。
.NET垃圾回收机制频繁的检查你电脑的内存并且把不再被使用的任何东西移除。没有固定的时间频率;它也许每秒执行上千次,几秒一次,或者任何时候,只要确定你处于闲时它就会执行。
这里有一些为程序员提供的建议。由于这个工作是在不可预知的时间执行,应用不得不带着这种考虑被设计。运行需要大量内存的代码应该先自我整理,总比等着垃圾回收执行要好,但似乎这做着比听上去要难。
小结
在继续之前,让我们总结一下创建一个.NET应用的步骤作为事先讨论。
1. 应用代码由.NET兼容的语言,比如C#编写(见图1.1)。
图1.1
2. 然后代码被编译为MSIL,被储存在集合里(见图1.2)。
图1.2
3. 当代码被运行的时候(无论是作为一个可执行程序被运行还是被其它代码使用),它必须首先被JIT编译器编译为本地代码。
图1.3
4. 本地代码在托管CLR下运行,其它应用或者进程也一样,如同图片1.4
图1.4