.NET之前的程序世界
传统上,针对Windows系列操作系统的软件开发,会使用C语言和Windows API联合编程的方式。不可否认,有无数的程序以这种费时的方式成功的开发出来了,但是多数人都认为使用原始API构造应用程序是一项复杂的工作。
C语言是一种非常简练的语言(而且到现在为止仍然是具有统治地位的语言,也是我最钟爱的语言),然而C程序员却不得不自己动手管理内存、使用令人畏惧的指针运算和各种底层操作,如果还要加上使用WindowsAPI定义的数以千计的全局函数和数据类型,现在有那么多有问题的程序在到处运行就不足为奇了。
C++对原始的基于C语言的软件开发进行了一次提升,可以把C++理解为在C之上的面向对象层。虽然C++程序员可以使用面向对象的三大支柱(封装、继承和多态)带来的好处,但是仍然无法摆脱C语言所带来的编程上的痛楚(如,手动管理内存、指针运算等)。
有很多崇尚更为简单的编程方式的程序员会从C++阵营转移到更为友善的语言,如VB(VisualBasic)。VB的流行归功于它能够使程序员花很少的时间就创建出复杂的用户界面、代码库以及数据库访问逻辑,而且隐藏了很多Windows API的复杂性。VB算得上是基于对象的编程语言,但它不是一个真正面向对象语言,它不允许程序员为类之间创建IS-A关系(继承关系),也不支持内置类型的参数化构造,还不能开发多线程的应用程序,除非你愿意使用底层API进行回调,这显然是既复杂又危险的工作。
Java是一种非常有生产力的OOP语言,它的语法结构来源于C++。Java的强大之处不仅仅在于其平台无关性,作为一种语言,它去掉了C++中诡异而令人厌恶的语法;作为一个平台,Java为程序员提供了许多预定义的包,使用这些包中的类和接口,Java程序员可以创建各种类型的纯Java应用程序。虽然Java是一种优雅的语言(也是我钟爱的另一种语言),但是使用Java意味着开发周期内从前台到后台都要使用Java,早期的Java基本上不支持与其他语言的集成(新版本的JVM还支持Ruby、Scala、Clojure等语言),因为Java的设计目标就是用单一语言满足所有需要。然而现实是已经有无数的既有代码并不是用Java完成的,它们与Java的结合几乎是难以完成的。
.NET平台的核心功能:
.NET平台的构造块
从程序员的角度看,.NET可以理解为一个运行环境和一个全面的基础类库。运行环境的正式名称是CLR(公共语言运行时),其主要作用是定位、加载和管理.NET类型,同时负责底层的细节工作,如内存管理、应用托管、线程处理、安全检查等。
.NET平台的另一个构造块是CTS(公共类型系统)。CTS规范完整描述了运行环境所支持的所有可能的数据类型和编程结构,指定了这些实体间如何交互,也规定它们在.NET元数据格式中的表示。
除了CLR和CTS规范之外,.NET平台提供了一个适用于全部.NET程序语言的基础类库。这个基础类库不仅封装了各种基本类型、如线程、I/O、图形绘制以及与外部硬件设备的交互,还支持很多实际开发中用到的服务。
C#的优点
由于.NET与以前的技术有着极大的差异,微软为此开发了一种新的编程语言C#。C#的核心语言和Java非常相似(有人说C#抄袭了Java,微软的辩解是C#和Java都属于C语言系列的,事实上2005年后的Java也能看到很多C#的影子),因此C#和Java一样语法简洁,使用简单,同时灵活且强大。以下是C#的核心特征:
-----------------------------2.0--------------------------------
-----------------------------3.5--------------------------------
-----------------------------4.0--------------------------------
关于C#语言需要理解的最为重要的一点是它生成的代码只能在.NET运行环境中执行,这些代码称为托管代码(managed code)。包含托管代码的二进制单元称为程序集(assembly);反之,不能直接在.NET运行环境中寄宿的代码称为非托管代码(unmanaged code)。
CTS
一个程序集可能包含很多不同的“类型”,CTS(公共类型系统)是关于类型的一个正式规范,它规定了类型必须如何定义才能被CLR承载。对于一个开发者来说,了解由CTS定义的类型是非常重要的。
1. 类类型
class Calc{ public int Add(int x, int y) { return x + y; } }
public interfaceIDraw { void Draw(); }
struct Point{ public int x, y; public Point(int x, int y) { this.x = x; this.y = y; } publicvoid Move(int dx, int dy) { x += dx; y += dy; } }
enum Gender{ Male, Female }
Delegate intBinaryOp(int x, int y);
CLR
从编程的角度来说,运行时(runtime)可以理解为执行给定编译单元所需的外部服务的集合。.NET平台的CLR提供了一个定义明确的运行时环境,可以被支持.NET的所有语言和平台所共享。CLR中最重要的部分是名为mscoree.dll的库,它相当于是.NET的执行引擎,其工作流程如下图所示: