1.2 C#语言特性
C#是一个支持多种编程范式的编程语言,它涵盖了强类型、面向对象、组件化、泛型、动态语言和函数式编程等多种范式。
C#是一种编译性语言,即需要使用编译器将C#的源文件转换成二进制程序才能运行。其派生于C语言家族,因此语法与C、C++、Java和JavaScript非常类似。C#还是一个跨平台的编程语言,如在Windows上编写的C#程序可以直接在Linux上运行。与Java语言的跨平台运行功能类似,C#源文件也需要由编译器编译成名为MSIL的中间语言程序,然后由.NET框架提供的解释器将MSIL代码翻译成机器代码完成执行过程。
Visual Studio 2015 Update 1开始提供C#命令行“解释器”——csi.exe,供程序员在交互式环境试验和执行一小段C#代码。这里之所以给“解释器”打引号,是因为实际上csi.exe是实时编译输入的C#代码并执行,实现了脚本语言解释器的效果。
C#是一个面向对象的编程语言,而且C#是面向组件的编程语言。应用程序一般由很多组件组成,且不断迭代升级。如果程序在运行过程中不需要重新设计,只需更换部分组件就能达到更好的性能,那么这对于后续的运维和升级都是非常方便的。就好比一辆汽车使用过程中在不需要变更其他零件的基础上,通过简单更换一些零件,如功率更强大的发动机或更耐磨的轮胎,就达到更高的行驶速率。而面向组件或者说组件化编程的核心是组件可以自包含和自描述。自包含是指组件包含了运行它所要求的所有信息,如所有的外部依赖、可执行代码等;自描述是指当前组件包含了自身与其他组件交互的描述信息,不需要其他的配置文件或额外信息来描述。
现代程序往往会长时间运行,C#提供了一系列机制来辅助编写具有高健壮性的代码。
1)垃圾回收机制:C#会自动将不再使用的对象占用的内存回收,以便有足够的内存供新的对象使用。
2)异常处理机制:长时间运行的程序不可避免地会发生种种意外,C#提供了结构化的机制来报告和处理这些意外情况。
3)类型安全机制:野指针、缓冲区溢出等是C/C++程序里经常犯的错误。野指针是指访问一段已删除的对象或访问了受限内存区域的指针。与空指针不同,野指针无法通过判断是否为NULL避免。野指针的危害就好比买了一个不存在的公司的股票,股票代码看起来是真实的,但是背后的公司可能已经注销或者根本不存在。缓冲区溢出是程序对接收到的数据没有进行有效的边界检测,向缓冲区内存填充数据时超过了缓冲区本身的容量,而导致数据溢出到分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。C#语言通过类型安全机制保证了程序无法读取未初始化的内存,不允许未加检测的类型转化,进而避免了野指针的问题;也不允许数组索引超过数组的上下边界,避免了缓冲区溢出问题。
C#提供了一套统一类型的系统,所有类型(包括int、double等原始类型)都继承自object类型,因此所有类型都有一套通用的操作,而且任何类型的数据都采用统一的方法存储。但与Java不同,出于性能的考虑,C#支持值类型和引用类型,我们将在第2章讨论这两种类型。
随着时间的推移,组件也会不断升级,这时新老版本组件的兼容性就显得很重要了。很多编程语言对兼容性的处理不够重视,导致升级某个组件到最新版本却引发程序不能正常使用。C#提供了一套版本控制设计手段,如使用virtual和override关键字、函数重载的规则、显式接口成员定义等方法来支持兼容性设计,我们将在第4章讨论这些特性。
C#还支持一些函数式编程范式,如将函数当作值处理、闭合、偏函数、模式匹配等多种函数式语言概念,我们将在后续章节讨论这些语言特性。