delegate是类型化了的函数指针,它主要应用于回调。
2008-02-17 00:10
267 查看
学习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);
instance +=new SomeFunction(anotherObject.anotherMethod);
...
然后调用instance(...),可以同时激发所有注册自里面的回调函数。
这是怎样实现的,首先要研究delegate内在的结构,在每个delegate里面包括了三个字段:
target ——》指向回调函数所属的对象实例(对于实例方法来言)
method ——》指向回调函数
prev ——》指向另外一个delegate 实例
通过prev就可以比较方便的实现delegate对链的支持。
CLR定义了Delegate.Combine和Delegate.Remove静态方法实现对链表的操作
在使用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);
instance +=new SomeFunction(anotherObject.anotherMethod);
...
然后调用instance(...),可以同时激发所有注册自里面的回调函数。
这是怎样实现的,首先要研究delegate内在的结构,在每个delegate里面包括了三个字段:
target ——》指向回调函数所属的对象实例(对于实例方法来言)
method ——》指向回调函数
prev ——》指向另外一个delegate 实例
通过prev就可以比较方便的实现delegate对链的支持。
CLR定义了Delegate.Combine和Delegate.Remove静态方法实现对链表的操作
相关文章推荐
- C语言大世界—————08指针类型(函数指针)中
- 6-2 程序填空(指针类型作为成员函数的参数)
- 关于结构指针类型数组做函数参数的一个问题#include<stdio.h>typede
- 函数处理,用指针类型是数据做函数参数比较大小
- 只言片语,C数据类型,函数指针类型
- 代表类成员函数类型的函数指针类型
- 成员函数指针与高效C++委托 (delegate)
- 6-2-b 指针类型作为成员函数的参数
- B继承自A,A指针无法隐式转换为B指针,函数参数只管指针类型,与实际指向对象无关
- 函数返回值系列之一返回指针类型的局部变量
- typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void)函数类型和函数指针的区别
- 用指针类型作为成员函数的参数
- 函数类型和函数指针类型(摘自 linux c编程一站式学习)
- 有关结构体指针与函数传参返回值类型的六种方法
- 回调的实质--函数指针
- 指向函数的指针和返回值是指针类型的函数
- 实现一个函数clone,可以对javascript中的5种主要的数据类型进行值复制。
- Delphi 函数指针 过程/函数类型
- c++中函数中变量内存分配以及返回指针、引用类型的思考
- iOS开发学习第十二课——函数指针定义 、函数回调 、动态排序