资源描述:
《代理(delegate)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、有些书上也称“代表”或“委托”。C#中取消了指针的概念。对指针恋恋不舍的程序员可以有两种解决方法:声明“非安全”(unsafe)代码段然后在其中使用指针或者使用C#的一个引用类型——“代理”(delegate)。“代理”相当与C中的函数指针原型,区别是C#是类型安全的。“代理”(delegate)(代表、委托):“代理”是类型安全的并且完全面向对象的。(1)在C#中,所有的代理都是从System.Delegate类派生的(delegate是System.Delegate的别名)。(2)代理隐含具有sealed属性,即不能用来派生
2、新的类型。(3)代理最大的作用就是为类的事件绑定事件处理程序。(4)在通过代理调用函数前,必须先检查代理是否为空(null),若非空,才能调用函数。(5)在代理实例中可以封装静态的方法也可以封装实例方法。(6)在创建代理实例时,需要传递将要映射的方法或其他代理实例以指明代理将要封装的函数原型(.NET中称为方法签名:signature)。注意,如果映射的是静态方法,传递的参数应该是类名.方法名,如果映射的是实例方法,传递的参数应该是实例名.方法名。(7)只有当两个代理实例所映射的方法以及该方法所属的对象都相同时,才认为它们是想等
3、的(从函数地址考虑)。(8)多个代理实例可以形成一个代理链,System.Delegate中定义了用来维护代理链的静态方法Combion,Remove,分别向代理链中添加代理实例和删除代理实例。(9)代理的定义必须放在任何类的外面,如delegateintMyDelegate();而在类的方法中调用MyDelegated=newMyDelegate(MyClass.MyMethod);来实例化自定义代理的实例。(10)代理三步曲:a.生成自定义代理类:delegateintMyDelegate();b.然后实例化代理类:MyDe
4、legated=newMyDelegate(MyClass.MyMethod);c.最后通过实例对象调用方法:intret=d();资料引用:http://www.knowsky.com/301783.html从函数指针到代理(C#代理入门)//c中的函数指针,可能更好理解#include"stdafx.h"#include"stdio.h"#include"stdlib.h"int(*Test)(intl); //定义函数指针//以下定义了两个处理函数,程序会根据情况调用不同的过程intAdd(intt){ returnt+t
5、;}int Mut(intt){ returnt*t;}//把函数做参数 inttest2(intt,int(*p)(int)){ returnp(t);}intmain(intargc,char*argv[]){ charinput[8]; printf("PleaseInputaNumber!"); scanf("%s",input); intt =atoi(input); intp; //大于10,此指针指向Add() if(t>10) Test =Add; //小于10,此指针指向Mut() else Test
6、=Mut; //通过指针调用 p = Test(t); printf("TheResultis%d",p); if(t>10) p = test2(t,Add); //小于10,此指针指向Mut() else p = test2(t,Mut); return0;}//c#中的代理,和函数指针其实一样,不过扩展了一些功能而已:)usingSystem;namespacetdele{ /// ///Class2的摘要说明。 /// publicclassClass2 { publicdelegateintTest(intt);
7、 //申明一个代理(函数指针) publiceventTeste; //触发词函数的事件 //以下定义了两个处理函数,程序会根据情况调用不同的过程 publicintAdd(intt) { returnt+t; } publicintMut(intt) { returnt*t; } publicClass2() { // //TODO:在此处添加构造函数逻辑 // } publicvoidtest() { intt=Int32.Parse(Console.ReadLine
8、()); //大于10,事件e的处理函数用Add() if(t>10) this.e +=newTest(Add); //小于10,Mut() else this.e +=newTest(Mut); //引发一个事件,得到处