.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的语言共享的公共运行时引擎
  • 全面和彻底的语言集成
  • 全面的基础类库
  • 不关注COM(Component Object Model)底层操作
  • 真正简化的部署模型

 

.NET平台的构造块

从程序员的角度看,.NET可以理解为一个运行环境和一个全面的基础类库。运行环境的正式名称是CLR(公共语言运行时),其主要作用是定位、加载和管理.NET类型,同时负责底层的细节工作,如内存管理、应用托管、线程处理、安全检查等。

.NET平台的另一个构造块是CTS(公共类型系统)。CTS规范完整描述了运行环境所支持的所有可能的数据类型和编程结构,指定了这些实体间如何交互,也规定它们在.NET元数据格式中的表示。

除了CLR和CTS规范之外,.NET平台提供了一个适用于全部.NET程序语言的基础类库。这个基础类库不仅封装了各种基本类型、如线程、I/O、图形绘制以及与外部硬件设备的交互,还支持很多实际开发中用到的服务。

 

[连载]C#程序设计(01)--- .NET概述_CLR

C#的优点

由于.NET与以前的技术有着极大的差异,微软为此开发了一种新的编程语言C#。C#的核心语言和Java非常相似(有人说C#抄袭了Java,微软的辩解是C#和Java都属于C语言系列的,事实上2005年后的Java也能看到很多C#的影子),因此C#和Java一样语法简洁,使用简单,同时灵活且强大。以下是C#的核心特征:

  • 没有可计数型的指针(说Java和C#完全没有指针的观点是狭隘的,因为Java和C#中的引用其实就是指针,只不过它不能够直接进行加减等运算来修改指针代表的内存地址。其实C#在绝对需要时也能够进行底层操作)
  • 垃圾回收器能够自动管理内存
  • 类、结构、接口、枚举和委托都有正式的语法结构
  • 支持运算符重载
  • 支持基于特性的编程(注解)

 -----------------------------2.0--------------------------------

  • 支持泛型操作,可以构建非常高效且类型安全的代码
  • 支持匿名方法,允许在任何需要委托类型的地方使用内联函数
  • 委托/事件模型的简化,包括协变、逆变以及方法组转换
  • 使用partial关键字实现跨多个代码文件定义单个类型的能力

-----------------------------3.5--------------------------------

  • 支持强类型的查询(如LINQ),用于和各种形式的数据进行交互
  • 支持匿名类型,允许建立一个类型的形而不是其行为
  • 使用扩展方法扩展既有类型(没有子类型)功能的能力
  • 支持Lambda操作符(=>),进一步简化委托类型的使用
  • 新的对象初始化语法,允许创建对象时设置属性的值

 -----------------------------4.0--------------------------------

  • 支持可选的方法参数和命名的方法参数
  • 支持通过dynamic关键字在运行时动态查找成员
  • 泛型类型使用协变和逆变,在泛型数据类型和Object集合之间进行相互映射

关于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;
    }
}



2.   接口类型

public interfaceIDraw {
     void Draw();
}



3.   结构类型

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;
     }
}



4.   枚举类型

enum Gender{ Male, Female }



5.   委托类型

Delegate intBinaryOp(int x, int y);



大部分的类型都可以包含任意数量的成员,其中包括:构造器、析构器、静态构造器、嵌套类型、操作符、方法、属性、索引器、字段、常量、事件。每一个成员都有一个给定的可见性特征(公开、私有、受保护等),有些成员可能被声明成抽象(abstract)以加强派生类的多态性,有些成员可声明为虚拟的(virtual)以定义一个可重写的实现。同样,这些成员也可以是静态的(跟类绑定)或是实例(跟对象绑定)。

 

CLR

从编程的角度来说,运行时(runtime)可以理解为执行给定编译单元所需的外部服务的集合。.NET平台的CLR提供了一个定义明确的运行时环境,可以被支持.NET的所有语言和平台所共享。CLR中最重要的部分是名为mscoree.dll的库,它相当于是.NET的执行引擎,其工作流程如下图所示:


[连载]C#程序设计(01)--- .NET概述_C#_02