C# 代理与事件共分为上下两篇,是我在学习该方面知识时记录的随笔!
文章索引:
C# 代理与事件上(delegate)
C# 代理与事件下(event)
C#代理概述
代理(delegate)是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。但它与普通的类不同的是delegate能够拥有一个签名,并且它只能持有与它的签名相匹配的方法的引用。
代理类似于C/C++ 中的函数指针极为类似,可以直接指向某一函数。但他拥有函数指针不具备的有点:
1、函数指针只能指向静态函数,但delegate既可以引用静态函数,又可以引用非静态成员函数。
2、与函数指针相比,delegate是面向对象,类型安全且受控的对象。即runtime能保证delegate指向一个有效的方法,不必要担心delegate会指向无效地址。
C++函数指针
int (* Test) (int l); //定义函数指针 //以下定义了两个处理函数,程序会根据情况调用不同的过程 int Add(int t) { return t+ t; } int Mut(int t) { return t*t; } //把函数做参数 int test2(int t,int (* p) (int )) { return p(t); } int main(int argc, char* argv[]) { char input[8]; printf("Please Input a Number!\n"); scanf("%s",input); int t = atoi(input); int p; //大于10,此指针指向Add() if(t > 10) Test = Add; //小于10,此指针指向Mut() else Test = Mut; //通过指针调用 p = Test(t); printf("The Result is %d",p); if(t > 10) p = test2(t,Add); //小于10,此指针指向Mut() else p = test2(t,Mut); return 0; }
代码中 p = test2(t,Add)和 p = test2(t,Mut)与delegate极为相似。
C# delegate
//声明一个代理的例子: public delegate int MyDelegate(int t); class program { //我们与传递的方法,方法的参数和返回类型必须和申明的代理相同 private static int Add(int t) { return t+t; } private static int Mul(int t) { return t*t; } private int Operation(int t,MyDelegate OperationDelegate) { OperationDelegate(t); } static void Main(string[] args) { Operation(10,Add); Operation(10,Mul); } }
将方法绑定到委托
public delegate int MyDelegate(int t); class program { //我们与传递的方法,方法的参数和返回类型必须和申明的代理相同 private static int Add(int t) { return t+t; } private static int Mul(int t) { return t*t; } private int Operation(int t,MyDelegate OperationDelegate) { OperationDelegate(t); } static void Main(string[] args) { MyDelegate delegate1,delegate2; delegate1=Add; delegate2=Mul; Operation(10,delegate1); Operation(10,delegate2); //绑定多个方法 MyDelegate delegate3; delegate3=Add;//绑定第一个方法,此为赋值语句,第一次不能使用“+=” delegate3+=Mul;//绑定另一个方法 ,此为绑定语句 Operation(10,delegate3); //取消某个绑定 delegate3-=Mul;//取消第二个绑定 Operation(10,delegate3); } }
总结
1、委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,同时使得程序具有更好的可扩展性。
2、使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
参考
1、C# 中的委托和事件(Jimmy Zhang )