C#教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1 C#语言简介

C#是.NET平台为应用开发而全新设计的一种现代编程语言,随着微软.NET战略进入开发人员的视野,C#很快成为Windows应用开发语言中的宠儿。

1.1.1 C#的由来

C#(读做“C sharp”)是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C#看起来与Java有着惊人的相似,它包括了单一继承界面、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET Windows网络框架的主角。

微软C#语言定义主要是从C和C++继承而来的,而且语言中的许多元素也反映了这一点。C#在设计者从C++继承的可选选项方面比Java要广泛一些(如structs),它还增加了自己新的特点(如源代码版本定义)。

1.1.2 C#的特点

作为编程语言,C#不仅是现代的、简单的、完全面向对象的,而且是类型安全的。重要的是,C#是一种现代编程语言。在类、名字空间、方法重载和异常处理等方面,C#去掉了C++中的许多复杂性,借鉴和修改了Java的许多特性,使其更加易于使用,不易出错。下面列举了一些C#在设计上的优点。

(1)简单性

C#在设计上的首要目标就是简单性。

没有指针是C#的一个显著特性。在默认情况下,用户使用一种可操控的(Managed)代码进行工作时,一些不安全的操作,如直接的内存存取,将是不允许的。

在C#中不再需要记住那些源于不同处理器结构的数据类型,如可变长的整数类型,C#在CLR层面统一了数据类型,使得.NET上的不同语言具有相同的类型系统。可以将每种类型看做一个对象,不管它是初始数据类型还是完全的类。

整型和布尔数据类型是完全不同的类型。这意味着if判别式的结果只能是布尔数据类型,如果是别的类型则编译器会报错。那种搞混了比较和赋值运算的错误不会再发生。

(2)现代性

许多在传统语言中必须由用户自己来实现的或者干脆没有的特征,都成为基础C#实现的一个部分。金融类型对于企业级编程语言来说是很受欢迎的一个附加类型。用户可以使用一个新的decimal数据类型进行货币计算。

安全性是现代应用的头等要求,C#通过代码访问安全机制来保证安全性。根据代码的身份来源,可以分为不同的安全级别,不同级别的代码在被调用时会受到不同的限制。

(3)面向对象

C#支持面向对象的所有关键概念:封装、继承和多态性。整个C#的类模型是建立在.NET虚拟对象系统(VOS,Virtual Object System)之上的,这个对象模型是基础架构的一部分,而不再是编程语言的一部分——它们是跨语言的。

C#中没有全局函数、变量或常数。每样东西必须封装在一个类中,或者作为一个实例成员(通过类的一个实例对象来访问),或者作为一个静态成员(通过类型来访问),这会使用户的C#代码具有更好的可读性,并且减少了发生命名冲突的可能性。

多重继承的优劣一直是面向对象领域争论的话题之一,然而在实际的开发中很少用到。在多数情况下,从多个基类派生所带来的问题比这种做法所能解决的问题要更多,因此C#的继承机制只允许一个基类。如果需要多重继承,用户可以使用接口。

(4)类型安全性

当用户在C/C++中定义了一个指针后,就可以自由地把它指向任意一个类型,包括做一些相当危险的事,如将一个整型指针指向双精度型数据。只要内存支持这一操作,它就会凑合着工作,这当然不是用户所设想的企业级编程语言类型的安全性。与此相反,C#实施了最严格的类型安全机制来保护它自身及其垃圾收集器。因此,程序员必须遵守关于变量的一些规定,如不能使用未初始化的变量。对于对象的成员变量,编译器负责将它们置零。局部变量用户应自己负责。如果使用了未经初始化的变量,编译器会提醒用户。这样做的好处是:用户可以摆脱因使用未初始化变量得到一个可笑结果的错误。

边界检查。当数组实际上只有n-1个元素时,不可能访问到它“额外”的数组元素n,这使重写未经分配的内存成为不可能。

算术运算溢出检查。C#允许在应用级或语句级检查这类操作中的溢出,当溢出发生时会出现—个异常。

C#中传递的引用参数是类型安全的。

(5)版本处理技术

在过去的几年中,几乎所有的程序员都和所谓的“DLL地狱”打过交道,产生这个问题是因为许多计算机上安装了同一DLL的不同版本。DLL是Dynamic Link Library的缩写,是一种编译为二进制机器代码的函数库。DLL在调用程序运行时才被调入内存执行,而不是在编译时链接到可执行程序内部的,这样可以使程序代码在二进制级别实现共享,而不必在每个应用程序中编译一个副本。如果DLL中的代码更新了,只需要替换DLL文件即可更新所有使用该DLL的程序。然而这同时带来了DLL文件版本的问题,不同版本的DLL可能与不同调用程序不兼容,同一版本DLL也不能同时为不同的调用程序服务,结果造成应用程序出现无法预料的错误,或者在用户计算机中不得不更换文件名来保存同一DLL的多个版本。这种混乱的状态被称为“DLL地狱”。C#则尽其所能支持这种版本处理功能,虽然C#自己并不能保证提供正确的版本处理结果,但它为程序员提供了处理这种版本的可能性。有了这个适当的支持,开发者可以确保当他开发的类库升级时,会与已有的客户应用保持二进制级别上的兼容性。