日期:2011-10-11  浏览次数:20462 次

A Comparative Overview of C#中文版(上篇)
作者:Ben Albahari
公司:Genamics
日期:2000年7月31日初版,2000年8月10日修订。
感谢以下人士支持和反馈(按字母先后顺序):Don Box、 C.R. Manning、 Joe Nalewabau、 John Osborn、 Thomas Rhode & Daryl Richter。
译者:荣耀
【译序:C#入门经典!希望文中针对新手的译注不会影响阅读的流畅性。限于译者时间和能力,文中倘有讹误,当以英文原版为准】

本文将以C#提供的新的编程方式以及它是如何改进两个近邻—Java和C++为中心。C#在很多方面和Java用了类似的方式改进C++。因此,我不打算重复诸如单根对象层次的优点之类的东西。正文将以C#和Java的相似之处概述开始,然后着重探究C#新特性。
背景
     2000年6月,微软同时宣布了.NET平台和一个名为C#的新的编程语言。C#是一个很好地融合了简单、表达力、性能的强类型的面向对象的语言。.NET平台以公共语言运行时(类似于Java虚拟机)和一个可被多种语言(它们可以通过编译成中间语言从而可以协同工作)共用的库为中心。C#和.NET有那么一点共生关系—C#的一些特性和.NET协作得很好,反之亦然(尽管.NET的目标是和多种语言很好地协作)。本文主要关注于C#,但视需要偶尔也会提及.NET。C#的设计借鉴了多种语言,但最主要的还是Java和C++。它是由Anders Hejlsberg(大名鼎鼎的Delphi【译注:说成Object Pascal更合适些】语言设计师)和Scott Wiltamuth共同设计的。
目录
1.   C#和Java
2.   属性
3.   索引器
4.   委托
5.   事件
6.   枚举
7.   集合和foreach语句
8.   结构
9.   类型一致
10.操作符重载
11.多态
12.接口
13.版本处理
14.参数修饰符
15.特性【译注:即attribute,我在《C#首席设计师Anders Hejlsberg专访》译文中(参见CSDN的http://www.csdn.net/develop/article/11/11580.shtm)曾说过,到目前为止,该词译法仍较混乱,甚至和property不分,都被译为“属性”(Visual Studio.NET 7.0 Beta 2 的联机文档就是如此)。但本文中,仍将其译为“特性”,以示区分】
16.选择语句
17.预定义类型
18.字段修饰符
19.跳转语句
20.组合体、名字空间和访问级别【译注:Assembly一词译法比较混乱,有的译为“配件”,有的译为“组件”,有的译为“组合体”,而Visual Studio.NET 7.0 Beta2联机文档上则译为“程序集”,从技术上讲,这个译法说的倒很事实,但总感觉和这个词的外观远了点,在译法尚未统一之前,本文暂译为“组合体”】
21.指针运算
22.多维数组【译注:这一节里还谈到了交错数组】
23.构造器和析构器
24.受控执行环境
25.库
26.互用性
27.结论
1.C#和Java
下面是C#和Java共有的特性列表,目的都是为了改进C++。这些特性虽非本文重点,但了解它们之间的相似之处还是很重要的。
l          编译为机器独立、语言独立的代码,运行在受控执行环境里;
l          采用垃圾收集机制,同时摒弃了指针(C#中,指针被限制在标为unsafe的代码内使用);
l          强有力的反射能力;
l          没有头文件,所有的代码都在包或组合体里,不存在类声明的循环依赖问题;
l          所有的类都派生自object,且必须用new关键字分配在堆上;【译注:Java中为Object;C#中为object,相当于.NET的System.Object】
l          当进入标为锁定/同步代码时,通过在对象上加锁来支持多线程;【译注:例如Java中可对方法施以synchronized关键字,在C#中可使用Monitor类、Mutex类、lock语句等等】
l          接口支持—多继承接口,单继承实现;
l          内部类;
l          类继承时无需指定访问级别;【译注:在C++中,你可以这么做:class cls2: private cls1{};等等】
l          没有全局函数或常量,一切都必须属于类;
l          数组和字符串都保存长度记数并具边界检查能力;
l          永远使用“.”操作符,不再有“->”、“::”操作符;
l          null和boolean/bool是关键字;【译注:Java中为boolean、C#中为bool,相当于System.Boolean】
l          所有的值在使用前必须被初始化;
l          if语句不能使用整型数为判别条件;
l          try语句块后可以跟finally从句。【译注:标准C++不可以,但Visual C++对SEH做了扩展,可以用__try和__finally】
2.属性
     对于Delphi和Visual Basic的用户来说,属性是个熟悉的概念。使用属性的目的是将获取器/设置器[译注:原文为getter/setter]的概念正式化,这是一个被广泛使用的模式,尤其是在RAD(快速应用开发)工具里。
     以下是你可能在Java或C++里写的典型代码:
foo.setSize (getSize () + 1);
label.getFont().setBold (true);
     同样代码在C#里可能会变成:
foo.size++;
label.font.bold = true;
C#代码对于使用foo和label的用户来说更直观、更可读。在实现属性方面,差不多同样简单:
Java/C++:
public int getSize()
{
    return size;
}
public void setSize (i