公共语言运行时是 .NET Framework 的基础。它负责在运行时管理代码的执行,并提供一些核心服务,如编译、内存管理、线程管理、代码执行、强制实施类型安全以及代码安全性验证。编译器以定义应用程序开发人员可用的基本数据类型的公共语言运行时为目标。由于公共语言运行时提供代码执行的托管环境,它提高了开发人员的工作效率并有利于开发可靠的应用程序。
本主题简要介绍了公共语言运行时的以下功能:
-
内存管理。
-
通用类型系统。
内存管理
公共语言运行时的垃圾回收器为应用程序管理内存的分配和释放。对开发人员而言,这就意味着在开发托管应用程序时不必编写执行内存管理任务的代码。自动内存管理可解决常见问题,例如,忘记释放对象并导致内存泄漏,或尝试访问已释放对象的内存。
初始化新进程时,运行时会为进程保留一个连续的地址空间区域。这个保留的地址空间被称为托管堆。托管堆维护着一个指针,用它指向将在堆中分配的下一个对象的地址。最初,该指针设置为指向托管堆的基址。托管堆上部署了所有引用类型。应用程序创建第一个引用类型时,将为托管堆的基址中的类型分配内存。应用程序创建下一个对象时,垃圾回收器在紧接第一个对象后面的地址空间内为它分配内存。只要地址空间可用,垃圾回收器就会继续以这种方式为新对象分配空间。
从托管堆中分配内存要比非托管内存分配速度快。由于运行时通过为指针添加值来为对象分配内存,所以这几乎和从堆栈中分配内存一样快。另外,由于连续分配的新对象在托管堆中是连续存储,所以应用程序可以快速访问这些对象。
除了分配内存之外,垃圾回收器的优化引擎还根据正在进行的分配情况确定执行回收的最佳时间。垃圾回收器在执行回收时,会释放应用程序不再使用的对象的内存。
通用类型系统
由于由运行时而非单个语言编译器来定义可用的基类型,因此提高了开发人员的工作效率。程序员可以用他们选择的开发语言编写应用程序,却仍能充分利用其他开发人员用其他语言编写的运行时、类库和组件。如果语言编译器以 .NET Framework 和公共语言运行时为目标,使用该编译器开发的组件通常可以通过使用其他语言开发的应用程序来访问。通用类型系统帮助实现语言独立性的目标;开发人员可以专注于使用自己选择的语言开发应用程序并可以利用以任意语言编写的库和组件。
通用类型系统支持两种一般类别的数据类型:
-
值类型
值类型直接包含它们的数据,值类型的实例要么在堆栈上分配,要么内联在结构中。值类型可以是内置的(由运行时实现)、用户定义的或枚举的。有关内置值类型的列表,请参见 Silverlight 的 .NET Framework 类库。
-
引用类型
引用类型存储对值的内存地址的引用,在堆上分配。引用类型可以是自描述类型、指针类型或接口类型。引用类型的类型可以由自描述类型的值来确定。自描述类型进一步细分成数组和类类型。类类型是用户定义的类、装箱的值类型和委托。
作为值类型的变量每个都有自己的数据副本,因此对一个变量的操作不会影响其他变量。作为引用类型的变量可以引用同一对象;因此对一个变量的操作会影响另一个变量所引用的同一对象。
除了接口之外,所有类型都派生自 System..::.Object 基类型。