微软公司认定自己不可能打败Java,因此它创造了C# 。这两种语言之间的相似程度之大是非常惊人的。微软预见C#最终也会象Java一样变得无所不在,甚至由此亲昵地把C#称为“.NET计划的母语”。我想,就是否需要学习这种编程语言的问题来看,这个理由都已经足够了。不过,其他具有推动意义的原因也是存在的。我将在这篇文章中对C#所能提供的一些好处逐一阐述。
欧洲计算机制造商协会(ECMA)已经于2001年10月13日批准C#语言规范(ECMA-334)成为一种新诞生的计算机产业标准。同时国际标准组织ISO也同意该标准进入该组织的审批阶段。而最初,C#语言不过是由微软作为它的.NET计划一部分被开发出来的,之后才联合Intel、Hewlett-Packard公司提交该语言规范作为业内标准。
C#语言规范自身最有趣的地方在于它不仅被设计为与平台无关而且,在许多方面甚至和运行时无关。只要相应的系统实现支持规范中说明的类型和功能即可,C#编译器则设计为可在几乎任何运行时体系结构上运行。事实上,一些最早的第三方系统实现干脆就直接把C#编译成了Java 字节码。你可以在halcyonsoft.com网站找到这样有意思的系统实现。
就程序可移植性而非源代码可移植性来说,C#语言规范最好同著名公共语言架构(CLI)这个ECMA标准结合起来运用。CLI 可谓.NET和公共语言运行时CLR的灵魂所在。使用CLI的第一款C#编译器正是微软.NET框架,显然这绝非一个偶然现象。
C#语言的设计者对他们从C、C++乃至Java程序开发中学习到的东西进行了充分利用。他们采纳了这些语言的最好方面,同时抛弃了那些语言的许多缺点和限制,从而创造出一种不仅现代化而且完全面向对象的语言。在许多领域,一些经常导致错误应用或误解的语言特征在C#语言中都被取消或者受到了特别的“保护”,结果促使普通开发人员能够更容易更安全地使用C#语言开发程序。
例如,C和C++都能直接通过指针的使用来操作内存。这种能力经常对高效率的程序来说是必要的,但是,在不正确地使用这一强大操作能力之时,它也是引发众多错误和内存泄露的主要来源。在意识到指针操作重要性的同时,C#语言设计者保证了这一能力在C#中的实现。但却完全阻止了误用的情况并且令你的操作目的同样可以达到。指针调用特征在新语言中是这样设计的:你必须显式地通过使用“fixed”和“unsafe”关键词在C#程序中调用该功能。
作为一种面向对象的语言,C# 在这方面的表现可圈可点。C#语言完全支持属性(数据成员)的概念以及其他面向对象编程的常用要素。在C、C++和Java环境下,get/set方法命名规范经常用作属性概念的表达(其实,为了实现同其他语言的互操作性,C#的内幕是CLI仍然需要把属性声明翻译为get/set方法)。除了属性声明之外,C# 天然地支持事件、声明值和索引类型、运算符重载以及指派(载功能上类同于C/C++的函数指针)等功能。
在使用微软C#实现的情况下,C# 程序“总是”产生受管代码(manged code)。简单地讲,这意味着编译的结果会产生包含嵌入CLI指令而非本机机器指令程序。CIL——也可以引申为微软中介语言MSIL(Microsoft Intermediate Language)或有时干脆就简写为IL——在概念上同Java的字节码类似,并且由遵从CLI的运行时(比如微软的CLR等)所能理解的低级指令集组成。
因为CLR负责把这些指令变换为机器可执行的代码并且为代码处理大多数基本服务(例如垃圾收集、堆和对象生存期管理以及类型检查等),所以这些程序就被称为受管代码。然而,因为你能直接在C#程序以内直接操作指针和内存,所以也并不是所有的C#程序都具有可检验的类型安全性。使用这类被监视特性的程序仍然运行在CLR的上下文环境内并且使用受管资源,但是,使用它们就意味着开发者必须承担部分内存管理的责任而且要把这么做的目的显式地通知编译器。
具有C、C++或Java技术背景的任何人学习C#都不成问题。甚至那些基本熟悉JavaScript和某些类型语言(例如Visual Basic等)的开发人员也会发现,转变C#的过程相当平滑和直接。照我看,在可用性方面,因为C#语言相当简练,Visual Basic .NET可就远远不及了。此外,即便C#再复杂,其程序的可读性也相当出色,真是既简明又精练。C#还提供了Visual Basic并不支持的某些特征,例如unsigned整数、运算符重载以及更强大的类型安全等。
在决定使用C#时,真正需要费工夫学习的其实是Microsoft .NET框架的基础类库BCL(Base Class Library)。C#自身只有区区77个关键词,而且其语法对许多程序员来说都是他们非常熟悉的。BCL则相反,它包含了超过4500个以上的类和无数的方法、属性,你将在C# 程序中用它来完成自己的任务。
对我来说,学习C#的唯一缺点是我已经习惯的一些语言特性都被取消或者还没有得以实现。例如,C#语言就不支持多重继承对象层次。原因是多重继承经常被误用,这是语言设计者一个有意识的决定,而且他们还选择了足以作为替代措施的另类设计。在没有采用多重继承的情况下,C#类只能从一个基类继承其功能,但可以实现尽可能多的支持接口。
另外还有个特性也丧失了,不过该特性在以后的版本中还会得到支持,这就是所谓的generics概念(C++ 程序员可以把它看作模板)。目前,在CLI和C#规范中增加对generics的支持还在研究中。
在最近和不远的将来C#都有望成为任何开发者工具箱中宝贵的珍藏。该语言和类库的标准化将保证你的技能在多种平台上畅通无阻,其语言特性和强大功能是推动你立即把它投入开发工作的重要原因。