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

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

  • 相关阅读:
    Azure Active Directory document ---reading notes
    tcp/ip 三次握手和4次挥手
    why microsoft named their cloud service Azure?
    Azure VMs
    Leetcode (C++) 9/20/2017开始
    How do you make an object in C? Used in RTOS.
    HF-DP1: strategy pattern
    确定一下学习的主要参考书
    记一下Thoratec的面试
    《Algorithm in C》by Sedgewick 读书笔记
  • 原文地址:https://www.cnblogs.com/BearOcean/p/309763.html
Copyright © 2020-2023  润新知