阅读本书你会发现,本书通篇都强调,C#语言决不该被孤立的看待,它必须与.NET Framework一起考虑。C#编译器是以.NET为特定目标的,所以这就意味着用C#写出来的代码必须运行在.NET Framework.的支持上。这样,对C#就有两个重要的推论: ? C#的体系结构和方法论反映了.NET的根本方法论。 ? 在许多情况下,C#的许多专用语言特性依赖于.NET的特性或者.NET基础类。 由于这种依赖关系,在开始C#编程之前,理解.NET的体系结构和方法论是重要的。这也正是本章的目的。 我们首先会了解一下当所有以.NET为目标架构的语言(包括C#)被编译和运行时都发生了什么。一旦我们有了大致的了解,我们将更加详细地了解一下Microsoft Intermediate Language (MSIL or simply IL),.NET上面所有的语言最终都会被编译为这种汇编语言。特别的,我们将了解一下IL、Common Type System (CTS)和Common Language Specification (CLS)是怎样共同作用使得.NET下面的语言可以协同工作的。我们也要讨论各种语言(Visual Basic 和 C++)怎样适合.NET的。 了解完这些后,我们将要继续了解一下.NET的其他特性,包括程序集、命名空间和.NET基础类。最后结束这一章之前我们要像C#开发人员一样对可以创建的应用程序的种类做一个大致的了解。1.1 C#与.NET的关系相比较其他语言来说,C#是一种新的编程语言,并且以下两个方面体现了他的重要性: ? 它是专门为微软.NET框架(一个为了开发、部署和执行分布式应用软件而设计的功能丰富的平台)设计的。 ? 它是一种基于现代面向对象设计方法的语言,在他设计时,面向对象原则已经得到显著应用20年之久,而且微软吸收了所有这些面向对象语言的经验。 一个重要的问题是要弄明白C#本身就是一种语言。尽管它是设计来产生.NET环境下的代码的,但是它不是.NET的一部分。还有一些特性.NET支持,但是C#并不支持,而且可能更令你惊奇的是,还有一些C#语言的特性.NET竟然不支持!(例如,一些运算符重载) 但是,因为C#语言是用于.NET的,所以对我们来说如果我们想要用C#开发出高效的软件,了解.NET Framework就是重要的。因此,在这一章,我们将要花些时间迅速透过表层来观察一下.NET。好,我们开始吧!1.2 公共语言运行时 .NET Framework的核心是运行时执行环境,其被大家称为公共语言运行时(CLR)或者.NET运行时。在CLR的控制下运行的代码常常本称作托管代码。 但是,在被CLR执行之前,所有我们开发的源代码(用C#或者其他的语言)都需要被编译。这样的编译需要两个步骤: 1. 将源代码编译为中间语言(IL)代码 2. 由CLR将中间语言代码编译为特定平台上面的代码 这两步编译过程是非常重要的,因为中间语言(IL)的存在正是.NET众多优点的关键。好,让我们来看看为什么。1.2.1 托管代码的优点 Microsoft中间语言与Java字节码共享一种思路,他们都是一种语法简单的低级语言(建立在数字代码基础上,而不是文本代码),可以被快速的翻译为本地机器码。代码有这样设计良好并且通用的语法是意义重大的优点。1.2.1.1 平台无关性 首先,这就意味着包含字节代码指令的相同的文件可以被部署在任何的平台,在运行时编译过程的最后一个阶段可以很容易的完成,所以代码可以运行在特定的平台上。换句话说,源代码被编译成中间语言使得我们可以获得.NET的平台无关性,这和在Java平台上源代码被编译为Java字节码以获得平台无关性的道理是一样的。 你应该注意到.NET的这种平台无关性目前还是理论上的,因为在本书写作的时候,还只有在Windows平台上才完全实现了.NET。但是,已经有一个部分实现的.NET(参见Mono项目,一个正在致力于建立于开源平台之上的.NET,具体请访问www.go-mono.com/)1.2.1.2 性能改进 尽管前面和Java作了比较,但是实际上中间语言(IL)比Java字节码更有野心。IL总是即时编译(被称为JIT编译),然而Java字节码常常是解释性的。像Java那样解释编译的一个缺点是,在运行时,将Java字节码翻译为本地可执行的代码这个过程导致了性能的损失(这里不包括最近新加入的Java平台,有些特定的Java平台已经实现了JIT编译)。 并不是一次就将整个应用程序编译(那样的话导致应用程序在启动的时候变得很慢),JIT仅仅是简单的将需要用到的一部分代码编译(就像他的名字,即时编译)。当代码一旦被编译完成后,这些代码就会被作为本地可执行的结果保存下来直到应用程序退出。所以,当这一部分代码再次被调用的时候不需要再次编译。Microsoft认为这个过程的效率比一开始就编译整个应用程序的代码要高得多。因为实际上每次运行大多数部分的应用程序代码都被执行的可能性是不大的。采用这种JIT编译器,这样的代码将永远不会被编译。 这就解释了我们为什么认为托管IL代码执行起来就像是执行本机代码一样快。但是,这并没有说明为什么Microsoft认为我们将会获得性能的提高。性能获得提高的一个原因是,当最后一个编译阶段在运行时发生时,JIT编译器已经确切的知道了程序将要运行于的处理器类型。这就意味着编译器可以优 猜你喜欢