WEB开发网
开发学院软件开发C语言 C# vs C++之一:委托 vs 函数指针 阅读

C# vs C++之一:委托 vs 函数指针

 2010-09-30 20:50:02 来源:WEB开发网   
核心提示:委托与函数指针辨析我们常见到C#技术文献用“类似C/C++函数指针的东西”介绍委托,这样好像是有道理的,C# vs C++之一:委托 vs 函数指针,因为二者的确有深层次的相通之处,委托和函数指针都描述了方法/函数的签名,似乎“相似”的说法更有把握了,但如果马上给二者划等

委托与函数指针辨析

我们常见到C#技术文献用“类似C/C++函数指针的东西”介绍委托。这样好像是有道理的,因为二者的确有深层次的相通之处。委托和函数指针都描述了方法/函数的签名,并通过统一的接口调用不同的实现。但二者又有明显的区别,简单说来,委托对象是真正的对象,而函数指针变量只是函数的入口地址。对于高层应用来讲,委托的灵活性和适用范围更胜函数指针;但对于底层应用,函数指针则是不可替代的。下面分别是委托类型和函数指针类型定义的例子:

delegate int Fn(int a, int b) //C#委托

typedef int (*Fn)(int a, int b) //C++函数指针

从形式上看,二者的参数列表和返回值都是相同的,只是一个采用关键字delegate,一个采用指针符号*。似乎“相似”的说法更有把握了,但如果马上给二者划等号就操之过急了。我们先实际验证一下,看看到底有什么不同:

//C#

delegate int Fn(int a, int b) ;

class Adder{

    private int c = 0;

    public int Add(int a, int b){

        return a + b + c;

    }

    public Adder(int c){ this.c = c; }

}

class Multiplier{

    private int c = 0;

    public int Multiple(int a, int b){

        return a * b * c;

    }

    public Multiplier(int c){ this.c = c; }

}

Adder adder = new Adder(1);

Multiplier multiplier = new Multiplier(2);

Fn fn = adder.Add;

fn(1, 2); //结果为4

fn = multiplier.Multiple;

fn(2, 3); //结果为12

1 2 3  下一页

Tags:vs 之一 委托

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接