浅谈通过delegate订阅事件


委托和事件是C#语言一个新的术语,其实他们最初是起源于c/C++中的函数指针。

实现步骤:
   1.  声明一个delegate对象。
   2. 实现和delegate具有相同参数和返回值的函数实现(可以是静态和非静态的)。
   3. 产生一个delegate对象的时候,把你刚刚实现的函数作为参数传给他的构造函数。

先看下面例子:
DAL类中:

    public delegate void deleException(System.Exception exception);//声明一个委托
    public event deleException evenException;//定义一个委托类型事件
    public void CallEvent(System.Exception exception)//触发事件方法
    {
          deleException messageEvent = evenException;
          if (messageEvent != null)
          {
                  //通知所有已订阅事件的对象(传递消息)
              messageEvent(exception);
          }
    }
    
          /// <summary>
      /// 打开与数据库连接
      /// </summary>
      /// <returns></returns>
      public bool Open()
      {
          try
          {
              if (m_SqlCeConnection != null && m_SqlCeConnection.State == ConnectionState.Closed)
                  m_SqlCeConnection.Open();
              return true;
          }
          catch (System.Exception e)
          {
              CallEvent(e);//触发事件
              return false;
          }
      }
      
Form1类中:
    private void ShowMessage(Exception ex)//事件处理
  {
     MessageBox.Show(ex.Message);
  }
 
    DAL _dal = new DAL(……)……;
    _dal.evenException += new deleException(ShowMessage);//侦听事件
    _dal.Open();//若Open()时产生异常,则调用ShowMessage();
    
    在上面的例子中或许看不出有什么好的,但在某些场合,就显示很重要了。比如通过线程更新UI,因为线程直接更新UI是不安全的。
    "委托"是"函数指针"链表,当然该链表也可以只有一个元素,如果这样的话:"委托" 约等于 "函数指针";
  "事件"是一类特特殊的"委托",你定义一个"事件",表示你同时定义了:一个委托+两个方法。
 
posted @ 2009-01-24 01:12  mike_fei  阅读(387)  评论(0编辑  收藏  举报