C#语言和类库

就象微软一贯的风格,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.Int32System.Long等等)、数组类型、事件类型、属性等等。在C#语言中,语言规范依赖于类库。

C++中,+是整型(包括intlong等等)变量的内置支持的操作,也非常容易理解。如果你想让某个自定义类也支持+操作,那么,你必须在这个自定义类上定义重载操作符+。也就是说,在C++中,存在一些内置的操作支持,但是这些内置的操作非常的精简,而且基本上可以采用计算机硬件实现。在C++中,语言规范不依赖于类库。

我们可以使用一张图更加清楚的说明我们上面的意思:

C#  VS  C++

我们的对比结果是:C++语言灵活,是对计算机硬件的一个高层抽象;C#语言方便,是依赖于底层类库的一个编程设施。

作为一个小小的论证,我们假设你使用C++语言的函数指针,假如你只是需要一个函数指针,简单的声明使用即可;在C#中,你不得不依赖于System.Delegate,即便是一个函数指针,你也不得不付出更高的数据空间(System.Delegate底层可能使用一个链表保存委托链)。

当然,对于大部分的程序来说,这似乎没有影响。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭