• .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可以映射到多个方法而带来方便?

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

  • 相关阅读:
    flask数据库
    python 百万级别类实例实现节省内存
    python定义一种新类型的元组
    python使用临时文件
    open函数 文件设置缓冲
    词频统计,字典成绩排序
    列表数组集合解析
    2019蓝桥杯Java第十题大学生B组——最短路径思想
    项目企业信息图谱分析有感——数据分析
    需求分析有感
  • 原文地址:https://www.cnblogs.com/BearOcean/p/309763.html
Copyright © 2020-2023  润新知