初学者在理解委托和事件时常常被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);//合并生成...