为何说C#中的delegate是类型安全的可管理的

来源:百度知道 编辑:UC知道 时间:2024/06/04 17:46:50
为何说C#中的delegate是类型安全的可管理的,
特别是相对于C语言中的指针而言。期盼您给个比较透彻的说明。
谢谢。

delegate是类型化了的函数指针,它主要应用于回调。

学习c++的对函数指针都不回陌生,它是一个保存了函数地址的变量,但除了地址,它没有包含任何额外的信息,如参数的个数、参数类型和函数的返回地址等,所以函数指针是非类型安全的。而delegate对回调提供了类型的安全性,从而使我们在处理回调等问题的时候可以更加优美的面向对象的方式来编写代码,并且在CLR的内部对delegate的操作提供了许多支持(如delegate链表),简化了我们常用的操作。

在使用delegate的过程中,首先要定义一个delegate的类型,如:

public delegate void SomeFunction(Object a,int i,...);

note:它是一个类的定义,可以放在任何地方,此类型定义了此delegate所接收的函数的样式:返回void,参数列表...

然后,为了使用,要定义类SomeFunction的一个实例:

public SomeFunction instance;

接着,我们就可以往这个delegate实例中放“符合规范”的函数(可以为实例函数和静态函数)。

instance +=new SomeFunction(someObject.SomeMethod);

其中someObject为某类的一个实例,它的方面SomeMethod符合此委托的规范要求,否则将编译报错。

最后,可以直接调用instance实例来实现对someObject的SomeMethod的回调。

instance(...);

##########################

只是从上面的实现中,貌似看不出delegate真正存在的价值,但实际上delegate增加了对链的支持,我们可以象下面这样应用:

instance +=new SomeFunction(someObject.SomeMethod);