事件是存在于类当中的一种特殊成员.
抽象上来说是一种很好理解的东西.
既是在特定情况下(如用户按下鼠标左键)激活一个事件.然后由另外一个
实体(如后台程序)通过预先建立好的联系,在得到事件已发生以后对该特
定事件进行处理.
所以事件模型需要一些必须的要素:
(1)事件源需要定义一个事件.
(2)事件源需要有一张"事件发生后通知谁"的列表.
(3)事件接收方需要定义能够接收哪些事件.
(4)事件接收方需要定义事件发生后进行何种处理的处理方法.
在C#中,事件模型是通过如下方式实现的:
在类A中申明一个事件:
class A
{
.....
public:
event EventHanlder SomeEvent;
.....
}
解释一下代码:
event:
指定一个事件时使用的关键字.
EventHanlder :
一个委托(delegate),申明如下:
public delegate void EventHandler( object sender , EventArgs e )
关于delegate,可以近似地认为是一个函数指针.
所以该"EventHanlder"实际上是希望与该事件发生联系的委托(delegate)
最后SomeEvent实际上是事件名.
event(关键字) EventHanlder(delegate) SomeEvent(事件名)
所以当我们定义一个事件:
event EventHanlder Click 时,翻译成自然语言既是在说:我要把名为click的
事件委托给一个类型为delegate void EventHandler( object sender , EventArgs e )
的方法来处理.
第2段关键的代码:
this.button1.Click += new System.EventHandler(this.button1_Click);
使用+=符号使事件Click与处理方法button1_Click方法关联起来.
也就是说,当Click事件被激活以后马上对button1_Click方法进行调用.
要注意的一点就是:因为事件实际上申明了要委托给型如:
void FuncName(object sender,EventArgs e)
的方法来处理.
所以button1_Click也一定要定义成:
button1_Click(object sender, EventArgs e)的形式.当然其实这些IDE都已经做好了,一般
情况下,不论是winform还是webform
只需要在方法里直接填代码就可以了.
再举一个例子:
分析正在做的项目,发现在Server.cpp中有这么一句: (C++.net)
OnRecieveData+=new AnalysisDataEventHanlder(this,&VSCServer::Recieve)
那么就是说在OnRecieveData事件与VSCServer::Recieve方法之间建立了联系.
然后在Server的基类:XSocket里找到了关于AnalysisDataEventHanlder的定义:
public __delegate int AnalysisDataEventHandler(String*)
和event的定义:
__event AnalysisDataEventHandler *OnReciveData;
仿佛事件与方法的关系已经建立了联系.
但是仍然有一点迷惑我,
那就是代码又怎么知道什么时候触发OnRecieveData事件呢?
按业务逻辑上来说,应该是在Socket接收到client发过来的消息后交给VSCServer::Recieve处理
那么是不是在 while(int i=Recieve(.....)!=0)
时激活OnReciveData.....那么这样的话又和在这里直接调用Recieve有什么关系?
是不是只是多了一个Event可以映射到多个方法而带来方便?
这个我还是不太理解 :_)