.Net 事件

事件是存在于类当中的一种特殊成员.
抽象上来说是一种很好理解的东西.
既是在特定情况下(如用户按下鼠标左键)激活一个事件.然后由另外一个
实体(如后台程序)通过预先建立好的联系,在得到事件已发生以后对该特
定事件进行处理.

所以事件模型需要一些必须的要素:
(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可以映射到多个方法而带来方便?

这个我还是不太理解 :_)
                         

posted @ 2006-01-02 12:08  BearOcean  阅读(494)  评论(0编辑  收藏  举报