第1章 .NET Framework和C#
.NET Framework包含4个组件。
第一个组件是公共语言运行时(Common Language Runtime),可将其视为.NET Framework的核心,公共语言运行时提供了低级核心服务供应用程序使用,并负责管理应用程序的代码。针对.NET Framework编写的代码称为托管代码(managed code),而其他代码称为非托管代码(unmanaged code)。
.NET Framework的第二个组件是类库,它包含大量可重用的类(类型)。.NET Framework通过类库在公共语言运行时中支持并行编程,并在并行计算平台中提供了诊断工具。
并行计算平台是.NET Framework的第三个组件,让您能够以自然而简单的方式编写搞笑的可扩展代码,以充分利用多个处理器。
.NET Framework的第四个组件是动态语言运行时,它建立在公共语言运行时的基础之上,向诸如IronRuby和IronPython等动态语言提供语言服务。与诸如C#等通用语言相比,动态语言更擅长执行某些任务,而动态语言运行时让您能够根据业务需求选择最合适的语言。不仅如此,动态语言运行时还让非动态语言(C#)能够以简单而一致的语法使用动态对象,而不管这些对象源自COM、IronRuby、IronPython还是JavaScript。
动态语言运行时(Dynamic Language Runtime, DLR)是.NET Framework4.0新增的,这是一个为动态计提供服务和支持的运行环境。
DLR建立在公共语言运行时的基础之上,这意味着动态语言可与其他.NET语言集成。DLR还让现有的静态语言(如C#)能够支持动态功能,这让它们能够以一致的方式使用动态对象,而不管这些对象来自何方。
动态语言
在诸如C#等使用静态类型的语言中,由编译器确定类型安全,如果无法确定,就将生成错误。在动态语言中,不会尝试确定类型安全。另外,大多数动态语言在运行阶段执行更复杂的类型操作,如判断方法重载是否正确,而C#在编译阶段做出这些判断。
实际上,对于静态类型语言在编译阶段执行的所有任务,动态语言都将在运行阶段执行。这包括在运行阶段使用eval或repl循环生成代码,以修改运行对象的状态。因此,动态语言提供了极大的灵活性,常用作脚本语言。
一些常见的动态语言包括Jscript、javaScript、Python、Ironpython、Ruby和IronRuby。
公共语言运行时(Common Language Runtime, CLR)是.NET Framework的核心,提供了一个同一类型系统和一个托管运行环境,它们为开发和执行独立于语言和平台的应用程序打下了坚实的基础,还有助于消除(至少是减少)众多常见的编程错误。
通用类型系统(Common Type System, CTS),让所有.NET语言共享相同的类型定义,这样便可以一致的方式操作这些类型。通用语言系统提供了一个最基本的规则集,所有.NET语言极其编译器都必须遵守,这个规则集称为公共语言规范(Common Language Specification, CLS)。
为使编译器生成的可执行目标代码不依赖于硬件平台,将托管代码进行了部分编译,已生成使用一种低级语言的代码,这种语言称为通用中间语言(Common Intermediate Language, CIL)。通用中间语言类似于汇编语言,由表示高级语言代码的低级指令组成。CIL代码是编译型的。
程序集(assembly)是部分编译单元(包),包含CIL指令并为定义类型提供了逻辑 边界。由于程序集是部分编译的,因此可以是32位的,也可以是64位的,这取决于操作系统和硬件。这意味着托管应用程序是独立于平台的,且无需重新编译或添加特殊指令就可以充分利用硬件技术。
公共语言运行时的另一个重要组成部分是托管运行环境,这种环境称为虚拟执行系统(Virtual Execution System, VES),它负责处理应用程序所需的低级核心服务。就像Java应用程序需要有Java虚拟机(JVM)才能运行一样,托管应用程序也需要有CLR(具体地说是VES)才能运行。
VES提供的服务之一是即时(Just-In-Time)编译器。即时编译指的是在运行阶段将经过部分编译的CIL代码转换为可执行的目标代码(本机代码)。
即时编译过程被称为jitting,而JIT编译器被称为jitter。
通用语言基础设施(Common Language Infrastructure, CLI)是公共语言运行时(Common Language Runtime)的开源版本。
命名空间使用点分式语法表示层次结构,每层之间都用句点(.)分隔。在类型的完整名称中,以最右边的句点为分界点,左边是命名空间,而右边是类型名。只有.NET编程语言支持命名空间。在CLR中,类型总是用完整名称标识,其中包含类型的名称及其所属的命名空间。
语言灵感
作为一种语言,C#借鉴了众多不同的语言,以形成其语法和主要功能,这包括Delphi5、C++和java2。
泛型系统是从Eiffel和Ada那里借鉴而来的;而LINQ和Lambda表达式评估主要是从Haskell和Lisp那里借鉴而来的。
C#还添加了一些来自动态语言(如Ruby)和函数语言(如F#)的功能。
C#是一种面向对象的语言,全面支持面向对象编程概念,如继承、多态、封装和抽象。另外,C#还支持面向组件编程,这让您能够指定自带文档的独立功能单元(组件),为此只需提供一个模型,它包含属性、方法、事件以及有关组件的元数据。
C#类型分两类:值类型和引用类型。值类型描述的值是完全独立的,这包括数据类型、枚举类型和结构;引用类型存储指向值的引用,而不是值本身。
在C#中,标识符是区分大小写的。推荐的命名约定建议如下:对于变量和参数名,使用Camel大小写规则,该规则要求除第一个单词外,其它单词的首字母都大写,如bookTitle;对于方法名和其他标识符,使用pascal大小写规则,该规则要求每个单词的首字母都大写,如BookTitle。
在C#中,有77个标识符在任何情况下都属于关键字。另外,还有24个关键字称为上下文关键字,它们仅在特定情况(上下文)中有特殊含义。离开该上下文后,这些关键字就可供您使用。
解决方案是一系列源代码文件和相关的元数据,编译时生成一个程序集。解决方案包含一个或多个项目,还有定义项目的额外文件和元数据。