就象微软一贯的风格,C#语言非常的方便。当你想快速的构造一个应用程序的时候,C#语言的效率非常的高。很显然,微软的类库和默认的处理机制在发挥着作用。作为一个程序员,你可以不用关系这些;因为在大多数的情况下,微软的这些默认的处理机制正好是你所需要的。
作为一个C++语言的爱好者和使用者,我更加关心的是,那些是语言本身的定义,那些是类库和默认的处理机制。
当我第一次好奇的考察C#语言的委托机制的时候,下面的代码使我大为的惊讶:
delegate void D(int x);
class C
{
public static void M1(int i) {...}
public static void M2(int i) {...}
}
class Test
{
static void
Main
() {
D cd1 = new D(C.M1); // M1
D cd2 = new D(C.M2); // M2
D cd3 = cd1 + cd2; // M1 + M2
D cd4 = cd3 + cd1; // M1 + M2 + M1
D cd5 = cd4 + cd3; // M1 + M2 + M1 + M1 + M2
}
}
如果说Main函数的第一行和第二行还可以理解的话,那么以后的函数代码使我迷惑不解。+怎么发生的呢?后来我逐渐的明白,当你声明一个委托的时候,实际上是声明了一个从System.Delegate类继承的子类,而+无非是作为System.Delegate的成员函数被继承下来。在C#语言中,存在大量的这样的语言本身依赖于底层API的情况,例如各种基本类型到从System.ValueType继承的类型(System.Int32,System.Long等等)、数组类型、事件类型、属性等等。在C#语言中,语言规范依赖于类库。
在C++中,+是整型(包括int、long等等)变量的内置支持的操作,也非常容易理解。如果你想让某个自定义类也支持+操作,那么,你必须在这个自定义类上定义重载操作符+。也就是说,在C++中,存在一些内置的操作支持,但是这些内置的操作非常的精简,而且基本上可以采用计算机硬件实现。在C++中,语言规范不依赖于类库。
我们可以使用一张图更加清楚的说明我们上面的意思:
我们的对比结果是:C++语言灵活,是对计算机硬件的一个高层抽象;C#语言方便,是依赖于底层类库的一个编程设施。
作为一个小小的论证,我们假设你使用C++语言的函数指针,假如你只是需要一个函数指针,简单的声明使用即可;在C#中,你不得不依赖于System.Delegate,即便是一个函数指针,你也不得不付出更高的数据空间(System.Delegate底层可能使用一个链表保存委托链)。
当然,对于大部分的程序来说,这似乎没有影响。