C# 的来源

2005年9月21日

C# 面世已经 3 年了,我们对它也有了一定的了解。它的来源如何呢?

C# 从名字上看,是 C++ 变更而来的。因此,它拥有不少 C++ 的特性。比如:编译执行。C# 程序虽然在执行前需要从中间代码文件编译成机器代码,但是在执行时是以机器代码形式执行的。这与 Java 不同。Java 是将源文件编译成 byte code 之后由 Java 虚拟机解释执行。不过 1.3 和 1.4 以后的 Java 开始逐渐支持动态地将反复执行的代码编译成机器代码的功能,以提高性能。

C# 支持异常。而 C++ 虽然也支持,但标准 C++ 里面不支持 finally 关键字。许多编译器附加了 __try 和 __finally 对,但这不能与 try 和 catch 放在同一个块里,必须套在外面一层,看上去就很难看。C# 就没有这样的问题,因为它的 try … catch … finally 是一套的。

C# 支持自动内存回收。即“垃圾回收”。这在商务编程上有很大的好处:一是大大减轻了程序员的工作强度,因为 C 和 C++ 编程中释放动态分配的内存也经常需要占用大于等于一半分配时的工作量,特别是在 C 语言中更显麻烦。二是由于代码是托管的,因此内存中的对象都按照运行环境可预知的情况相连接,因此在必要的时候可以做内存紧缩。内存紧缩就是内存碎片整理,不是用压缩算法来压缩。C/C++ 之所以无法做到这一点是因为 C/C++ 的源代码在编译后把源代码中的类结构信息都剪切掉了很多,无法让运行时环境来识别和管理。另外则是 C/C++ 中由于 C 语言的特性,所有内存地址中的内容都可以强制转换成指针,而到底哪些内容转换成了指针是无法预料的,因此运行时环境无法判断如何移动对象才是安全的,所以通常情况下不能进行内存紧缩。正由于 C# 编译后的中间代码是交给运行时环境处理的,因此可以在进一步编译成机器代码的时候保留其类结构,所以不仅仅能进行内存回收,还能进行“反射”。所谓反射是指通过类的名称来查找和使用类的结构。这使得它的动态特性更好。

但是,需要说明的是,正因为反射的动态特性太好,因此不要随意使用,否则会使代码很难懂。

C# 继承了 Delphi 的一些特性,这也是 Anders Heijlsberg 到了微软以后人们预期中带来的变化。比如属性,是 C++ 所没有的特性。在 C# 中此功能得到了应用。而且,const 和 readonly 也是 C# 中特别的两个关键字,它们各有特殊的用法,与 C++ 中的 const 不同。

C# 也继承了 VB 的特性。VB 本来也有动态内存回收机制,但是它有一个限制:用 Type 关键字定义的类型,无法动态分配。只有类模块才能从内存中动态分配。不过这已经是很不错了。QBasic 连类模块的功能都没有,因此实在限制太大了。C# 中的 struct 和 VB 中的 Type 类似,也不能从内存中动态分配,只能将 new 关键字新建的对象复制给 struct 结构体。即,定义一个对象名称,只是分配给它一个引用(即指针),而定义一个结构体名称,则分配给它结构体大小的内存空间。对结构体进行赋值操作,实际上是将一个结构体整个地复制给了另一个,而不是将它的引用复制给另一个。

C# 继承了 Java 的特性。比如写代码时,是一层一层嵌套的,不是像 C++ 和 C 那样先声明然后写实现。C++ 支持多重继承而 C# 不支持。因为不支持多重继承,因此 C# 支持 interface 即接口,而此功能 Java 也支持。

Visual C# 的文本编辑器的语法错误高亮功能与以前的 Visual J++ 和 Visual Basic 很相像。

C# 2.0 中开始支持泛型,是一种类似 C++ 模板的功能,但与模板不同,泛型不会引起代码过快膨胀。几天前我看到一种防止 C++ 模板全部实现在头文件中的方法:使用 void * 在 .cpp 文件中实现模板的实际功能,而不使用 template。然后让头文件中的模板对 .cpp 文件中实现的模板功能加上强制类型类型转换以实现接口的封装。这样与 C# 的模板功能也相同了。但要注意的是,如果遇到像 double 等与 void * 不兼容的类型,就无法使用了。

C# 终于是一个非所谓“全新”的,有内存越界保护、类型保护和自动内存回收的面向对象的程序设计语言,它和 VB .NET 终于实现了比尔·盖茨的梦想。从 GWBasic 这样一个玩具型语言变为结构化的 QBasic,再变为基于对象和有动态内存分配功能的 Visual Basic,再变为 VB .NET,真是曲折的道路啊。人家说,Java 不是蛮好么,但 Bill 还是不服,最后就弄出了一套这样的语言,果然是功夫不负有心人。当然 Bill 只是策划者,还需要有微软无数员工的奉献和微软外社会给予的大量资金的支持,因此我们千万不要忘了那些在幕后默默无闻辛勤耕耘着的地球上的人们啊。

“C# 的来源” 只有一条评论

  1. Lincoln 在

    哇,buer错哇。以后不会C#就来问小范。

留下您的评论