淺談通過delegate訂閱事件

iDotNetSpace發表於2009-02-01
委託和事件是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);
          }
    }
    
          ///
      /// 開啟與資料庫連線
      ///

      ///
      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是不安全的。
    "委託"是"函式指標"連結串列,當然該連結串列也可以只有一個元素,如果這樣的話:"委託" 約等於 "函式指標";
  "事件"是一類特特殊的"委託",你定義一個"事件",表示你同時定義了:一個委託+兩個方法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-544952/,如需轉載,請註明出處,否則將追究法律責任。

相關文章