C# in Depth-剖析.NET 平台
1.7 剖析.NET 平台
最开始引入时,.NET这个词涵义甚广,用来包罗微软公司的多种技术。例如,Windows LiveID曾被叫做.NET Passport,虽然它和目前的.NET没有任何明显的联系。
幸好,这个混乱的局面逐渐平息下来了。本节要探讨.NET的各个组成部分。本书会提到3种不同的特性:
①C#语言本身的特性
②运行时的特性
③.NET框架库的特性
本书重点是在C#语言上。通常只有在与C#本身的特性有关时,才会解释运行时和框架的特性。
但是,只有在你清楚地理解了三者的差异之后,才能真正理解这些特性。
特性经常会发生重叠,但重要的是理解其中的基本原理。
1.7.1 C#语言
C#规范定义了C#
C#语言是由它的规范定义的。C#规范描述了C#源代码的格式,其中包括语法和行为。
规范中并没有描述编译器输出要在什么平台上运行,只描述了两者进行交互的要点。
例如,C#语言需要一个名为 System.IDisposable 的类型,其中包含一个名为 Dispose 的方法。它们是定义using 语句所必需的。
同样,平台需要(不管以什么样的形式)同时支持值类型和引用类型,另外还要支持垃圾回收。
C#理论上可以编译其他平台
理论上,任何平台只要支持要求的特性,C#编译器就可以以它为目标平台。
例如,C#编译器除了可以以IL(Intermediate Language,中间语言,是本书写作期间最常见的一种输出形式)形式输出外,还可以以其他合法形式输出。
运行时完全可以对C#编译器的输出进行解释,或将其直接完全转换为本地代码(native code),而不必非要对它进行JIT编译。尽管这些情况比较少见,但它们确实存在。
1.7.2 运行时
.NET平台的运行时部分是数量相当少的一些代码,它们负责确保用IL写的程序以符合CLI规范的方式执行。
CLI的运行时部分称为CLR(公共语言运行时)。以后提到CLR时,是指微软实现的CLR。
语言的一些元素永远不会在运行时的级别上出现,但也有一些元素越过了这个界线。
例如,枚举器就不是在运行时的级别上定义的。
相比之下,虽然数组和委托对IDisposable 接口来说没有任何特别的含义,但它们对于“运行时”来说都是十分重要的。
1.7.3 框架库
库提供了可供我们在程序中使用的代码
.NET中的框架库主要是以IL的形式构建的,只有在必要时才使用本地代码。
这是运行时优势的一个体现:你自己写的代码并非天生就是“二等公民”——它完全能够提供与它利用的库一样强大的功能和性能。
库中的代码量要比运行时的代码量多得多,这跟车和引擎的关系是一样的。
.NET标准库
.NET库得到了部分标准化。CLI规范提供了大量不同的概要协议和核心内容库。
规范包含两个部分:
①对库的常规文字描述,包括哪些配置文件中包括哪些库。
②以XML格式描述了库本身的细节。这是在C#中使用XML注释时生成的相同形式的文档。
.NET非标准库
.NET中有许多东西都不是基本库定义的。
如果写一个程序,在其中只使用来自规范定义的库,而且以正确的方式使用它们,那么代码应该能在任何实现(包括Mono、.NET等)上顺利地运行。
但在实际应用中,几乎任意规模的任意程序都会使用非标准的库,如Windows Forms或ASP.NET。
Mono项目也有它自己的、不是.NET一部分的库,如GTK#。另外,它也实现了许多非标准的库。
.NET是微软公司提供的运行时和库的组合
.NET一词是指微软公司提供的运行时和库的组合,其中也包含C#和VB.NET编译器。
可以把它视为在Windows顶部构建的一个完整的开发平台。