委托和事件的直接理解

初学者在理解委托和事件时常常被msdn搞糊涂,为了让初学的人快速应用的委托和事件模型编程,我在这里主要是提出理解的关键,以下代码都可直接运行,先看下面的代码。usingSystem;namespacedelegeteTest{classdelegeteClass{publicdelegatevoidfHandler(inta);//关键-此行可以看成类的声明publicfHandlerf0;publicvoidd(inta,intb){intc=a+b;f0(c);}}classtest{publicvoidoutput(intmun){System.Console.WriteLine("{0}",mun);}[STAThread]staticvoidMain(string[]args){testt=newtest();delegeteClassdc=newdelegeteClass();dc.f0=newdelegeteTest.delegeteClass.fHandler(t.output);//实例的初始化dc.d(2,3);}}}解释一下"关键":实际上publicdelegatevoidfHandler(inta);可以看成如下:classfHandler{.....}---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---类内部由编译器自动完成,是一个sealed类通过反汇编可以看到,是一个类的声明,它检查加入自己的函数的信息,如,返回值和参数类型现在熟悉vc++的人可能感觉到publicdelegatevoidfHandler(inta);这句就象一个宏现在好了既然是个类的定义,那么也可以直接拿到命名空间下了usingSystem;namespacedelegeteTest{publicdelegatevoidfHandler(inta);//fHandler现在上升到了类的层次classdelegeteClass{publicfHandlerf0;//声明了委托fHandler的实例f0;publicfHandlerf1;//也可以再声明一个fHandler类的实例f1;publicvoidd(inta,intb){intc=a+b;f0(c);}}classtest{publicvoidoutput(intmun){System.Console.WriteLine("{0}",mun);}[STAThread]staticvoidMain(string[]args){testt=newtest();delegeteClassdc=newdelegeteClass();dc.f0=newdelegeteTest.fHandler(t.output);//此行做相应的修改dc.d(2,3);}}}有以上可知publicdelegatevoidfHandler(inta)这行代码只能放在能够声明类的地方,自然fHandler.后面的函数都是静态方法了,如fHandler.Equals(...);---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---那么fHandler到底声明了什么?实际上是声明了函数的类型,既函数的有关信息(如返回值,参数类型)。说到委托还是要说一下委托类型的实例。在msdn中的很多地方,(委托)这个词指的是委托类型的实例,它拥有了一个列表,列表的每一项包含了函数信息和函数所在的对象的引用。在声明fHandler类的实例f0的时候,f0还不能用,是空的,所以f0需要初始化dc.f0=newdelegeteTest.fHandler(t.output);初始化的参数包含了两个信息t--对象的引用,output--函数信息,如果把初始化的这句注释掉,你运行一下看有什么信息----“未将对象引用设置到对象的实例”。另外output函数的参数和返回值需要和fHandler的类声明一致,这是由编译器在编译时检查的。经过初始化之后现在实例中有了一项数据(实际上大多数只有一项,这样效率比较高,也就是singlecast的,此时实例是Delegate类型的(注意是大写的D))。现在说一下委托的多播(multicast),实际上委托的多播就是把列表里的每一项函数调用一次),但是多播的效率不是很高的所以委托的大部分实例都是单播(singlecast),另外可能委托的实例会根据列表内函数的个数来运行不同的机制(这里我们就没必要研究它了)。看下面的代码:namespacedelegeteTest{publicdelegatevoidfHandler(inta);classdelegeteClass{publicfHandlerf0;publicfHandlerf1;publicvoidd(inta,intb){intc=a+b;f1(c);//合并指针列表的多播委托}}classtest{publicvoidoutput(intmun){System.Console.WriteLine("函数1显示{0}",mun);}publicvoidoutput1(intmun){System.Console.WriteLine("函数2显示{0}",mun);}---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---[STAThread]staticvoidMain(string[]args){testt=newtest();delegeteClassdc=newdelegeteClass();dc.f0=newdelegeteTest.fHandler(t.output);dc.f1=newfHandler(t.output1);System.Console.WriteLine("第一次触发");dc.d(2,3);//第一次触发dc.f1=(fHandler)Delegatebine(dc.f0,dc.f1);//合并生成...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?