Delegate的总结
delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate会指向无效地址或者越界地址。
自己对Delegate的理解
“delegate是C#中的一种类型。”delegate与class是类似的,class定义一种类型,delegate也定义一种类型。class可以定义各种各样的类,如classA、classB,而delegate可以定义各种各样的代理,如delegate1,delegate2。与class不同的是,delegate的定义没有字段、属性、方法等,只有签名(返回值及参数)。
“它实际上是一个能够持有对某个方法的引用的类。”delegate对象可以持有对某个方法的引用,这个方法的签名必须与代理类型的签名一致(这就是“delegate定义回调方法的接口”这一说法的原由)。代理对象持有对这个方法的引用,当调用代理对象时,即实现对这个方法的调用。之所以能通过调用代理对象来实现对方法的调用,是因为在实例化代理对象时,把传入方法的地址赋给了代理对象,使得当调用代理对象时,内存中的指令指针即指向传入方法的入口,执行传入方法的方法体。
利用代理来实现多路广播时,即把多个方法的引用(即内存地址)保存到代理的方法引用队列。调用代理对象时,根据代理对象的方法引用队列,内存中的指令指针即逐个指向每个方法的入口,按次序执行每个方法的方法体。
事件的发布与订阅。所谓事件,就是指当某个特定的事情发生时,类或对象通过事件通知关注此事情的类或对象。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。事件的实现是依赖于代理的。事件的实现原理即,订户把响应事件的方法传递给发行者,当特定的事情发生时,发行者能够调用这些响应事件的方法。在代码级的实现即,发行者定义一个delegate类型,提供一个public的delegate对象作为字段或属性;订户(可以是多个)通过将响应事件的方法传递给delegate类型来实例化一个delegate对象,并通过+=运算符,将delegate对象赋值给发行者的delegate对象,实际上就是多路广播。当特定的事情发生时,发行者调用delegate对象,即调用所有订户的响应事件的方法。










