|
事件的本质 |
事件的本质小结
using System;
class A1{ public delegate void publisher(); public event publisher OnPublish;//其实ONPUBLISH 就是一个委托 public void touchMethod() { if(null!=OnPublish) { OnPublish(); } else Console.WriteLine("委托链中没有找到合适的事件方法"); } public void firstMethod() { Console.WriteLine("我是第一个事件执行的方法"); } public void secondMethod() { Console.WriteLine("我是第二个事件执行的方法"); } public void threeMethod() { Console.WriteLine("我是第三个事件执行的方法"); }
}class test{ static void Main() { A1 a=new A1(); a.OnPublish +=a.firstMethod;//事件其实是委托类的一个实例,只是触发方法不能在类 a.OnPublish+=a.secondMethod;//外进行而矣,这也是他和委托真正对象的区别 a.OnPublish+=a.threeMethod; a.touchMethod(); Console.ReadKey(); Console.WriteLine(); A1.publisher publisherDelegate=null;//定义一个委托,其实定义了一个委托类(即委托名表示该类),而且是一静态的 publisherDelegate+=a.firstMethod; //如果定义在类中即为该类的一个静态成员 publisherDelegate+=a.secondMethod; publisherDelegate(); Console.ReadKey(); }}
小结:(1)delegate void TheDelegate(参数1)其实这句定义了一个TheDelegate委托类{注意:不是委托实例对象}.而且"参数1"就是触发事件时的,对事件响应函数的参数.
(2)public event TheDelegate XXXX;////XXXX是事件对象--本质是委托的实例.从另一个角度看,XXXX是委托或者说是委托链.因为假如 定义了一个 public TheDelegate YYYY;这个标准的委托实例对象可以这样被初始化YYYYY=XXXXX证明了这一点;(3)接(2)XXXX和YYYYY的区别:XXXX只能在发行事件中进行触发,格式:XXXX(参数1)----要和响应事件方法一样.这样安全性更高.(4)定义了一个委托而得到的"委托类",是一个静态的.可以出现在类能够出现的地方.如:class A{TheDelegate}; 调用时.A.TeDelegate因为是A的成员.但其实例对象不是静态的;调用, A a=new A();a.YYYYY; (5)采用.NET FRAMEWORK中的标准public delegate void TheDelegateEventHandler(object sender,EventArgs(子类) e);
| |
|
|
|
|