在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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 )
|
请发表评论