C#中的建立事件

來源:互聯網
上載者:User
    我想學一下如何定議事件,找了一篇文章學習,可是沒看懂,不過感覺這篇文章挺好,就留下來了。

目錄:
   介紹委託和事件
   聲明事件(定義事件)
   註冊事件
   實現事件
   觸發事件
   為事件增加“添加/刪除”方法 

一  介紹委託和事件

事件是特殊化的委託,委託是事件的基礎,所以在介紹事件之前先介紹一下委託。

委託:使用委託可以將方法應用(不是方法)封裝在委派物件內,然後將委派物件傳遞給調用方法的代碼,這樣編譯的時候代碼就沒有必要知道調用哪個方法。通過使用委託程式能夠在運行時動態調用不供的方法。
 
事件:事件是對象發送的訊息,發送訊號通知客戶發生了操作。這個操作可能是由按一下滑鼠引起的,也可能是由某些其他的程式邏輯觸發的。事件的發送方不需要知道那個對象或者方法接收它引發的事件,發送方只需知道在它和接收方之間存在的中介(Deletgate) 

二. 聲明事件(定義事件)

在GUI圖形介面中的事件(單擊按鈕或者選擇菜單等)是已經定義好的事件,所需要的就是註冊事件。我們也可以自己定義聲明事件,可以將自己定義的事件應用到程式的任何地方。事件和委託是分不開的,c# 中使用委託來聲明事件。

如果在類裡面聲明事件,那麼必須先聲明該事件的委託類型,也可以使用一個事先已經聲明好的委託類型。

下面是一個聲明事件的例子:
using system;

public delegate void MenuHandler()  //事先申明一個委託,也可以在類的內部聲明委託類型

public class Menuitem            //聲明一個功能表項目的類

{
      public event MenuHadler MenuSelection;// 聲明一個事件並指定它的委託類型
      string  text ;//聲明一個字串
      public MenuItem(string text)     //功能表項目類的建構函式
      {
       this.text=text;                // 初始化text字串
      }     

      public void Fird()
      {
       
MenuSelection;               //定義一個觸發事件的方法(後面將用到)
      }
      public string Text                //定義屬性
      {
       get
       {      
        return text;
       }
       set
       {
       text=value;
       }
}
}

程式首先定義個一個叫做MenuHandler的委託,然後定義了叫做 MenuItem 的類,MenuItem類包含了一個MenuSelection 事件(菜單被選擇事件),事件的委託類型是MenuHandler。事件的聲明完成啦,下面開始註冊事件

三.註冊事件

這裡先講一下 publisher/subscriber(發行者/訂閱者)模式,因為事件就是從這個模式繼承下來的。一個訊息的傳送者
(Sender) 稱之為 Publisher,而該訊息的接收者
(Receiver),則稱之為Subscriber,Subscriber(訂閱者)在Publisher(發行者)處註冊自己,Publisher發
生改變的時候,通知Subscriber做適當的操作,很類似設計模式中的Observer 。

在這裡我們認為註冊的程式就是訂閱者(Subscriber)。事件相當於發行者(Publisher),下面的程式表明了如何把訂閱器串連到發布器:
using system;

public class DelegateAndEvents     //定義個註冊事件的類

{
       public static void int Main ()
       {
             SiteManager sm=new SiteManager (); // SiteManager是一個網站管理類
             MenuItem AddMenu= new MenuItem(“Add”) //定義一個新的事件類別
             MenuItem DelMenu=new MenuItem(“Delete”) //定義另外一個新的事件類別
            //通過委託,sm類的Addsite 方法 註冊到事件中
            AddMenu.MenuSelelction+=new MenuHandler(sm.AddSite)
            //通過委託,sm類的DeleteSite 方法 註冊到事件中
             DelMenu.MenuSelelction+=new MenuHandler(sm. DeleteSite)
        }
}

從註冊事件的那行代碼來看,事件就像是事件類別的一個欄位(屬性),但是對它的訪問是很受限制的,只能通過:在該欄位上撰寫新的委託(+=)或者從欄位(可能是複合欄位)移除委託(-=)進行訪問,
移除註冊事件:DelMenu.MenuSelelction-=new MenuHandler(sm. DeleteSite)

四.實現事件

這裡就要講到上個例子中的SiteManager類,它包含了事件需要實現的方法(AddSite,DeleteSite),SiteManager類的方法一定要符合事件的委託類型和傳回型別,在委託添加到事件前,該方法能夠以這個方式付給委託。using system;
public class SiteManger  //網站管理類
{
        public SiteManger()         //建構函式 初始設定變數
        {
               //impelement something
        }
        public void AddSite()    //方法要符合委託的類型
        {
        // impelement  執行添加網站的作業碼
        }
        public void DeleteSite()     //方法要符合委託的類型
        {
        // impelement  執行刪除網站的作業碼
        }
}

 

SiteManger類的方法要符合委託類型,這樣他的方法可以很方便的當作事件的方法使用。
五. 觸發事件
當呼叫事件時就可以說時觸發了事件。事件是從定義它的類中觸發的
樣本

using system;

public class  menu          //定義一個菜單類
{
        public menu(strng title)  //類的建構函式
        {
               //初始設定變數
        }
        public void Run()    //觸發事件的過程
        {
        //聲明一個功能表項目對象(menuItem前面已經定義)
        menuItem  myMenuItem=new menuItem   }
        myMenuItem.fire //調用fire 方法觸發事件,事件執行SiteManger類的方法
        }
}

 

到此為止我就完成了整個事件的實現過程。

六.為事件增加“添加/刪除”方法
 如果由大量的方法需要註冊到事件時,可以為為事件增加 Add,Remove 方法。通過訪問事件的“添加/刪除方法”來註冊方法

樣本:

using sytem;

pulic Delete ovid MenuHandler(object sender,EventArgs e); //樣本1的變形
public class MenuItem
{
    int numberof Events;
    string tex;
    private  MenuHandler mh=null;  //內部得一個委託
    public event MenuHandler MenuSelecton
    {
   
   
add                //增加“添加”方法
        {
        mh+=value;
        nuberofevents++;
        }
        remove
        {
        mh-=value;
        numberofevents--;
        }
    }
}

   
           
           
           
           
           
        轉自:http://www.cnblogs.com/cngis/articles/14421.html

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.