委託和事件

要爲類構造一個事件,必須用 event 來聲明一個 delegate 型的字段,如:
puclic calss test{
         public delegate eventhandler(object sender, eventargs e); //聲明爲delegate 型的事件;
}
  然後要指定一個事件的名稱,並寫出處理語句:
        public event  eventhandler load
  在創建類的實例後定義這個 “load”事件:
        test m=new test();
        m.load=new eventhandler(m_load);
        void m_load(object sender, eventargs e)
        {
                messagebox.show(" this is a class event");
        }      
  再看看下面的完整的一段代碼:
using system;

class testclass
{
     static void main(string[] args)
      {
         eventclass myeventclass = new eventclass();
         myeventclass.customevent += new eventclass.customeventhandler(customevent1); // 關聯事件句柄;
         myeventclass.customevent += new eventclass.customeventhandler(customevent2);
        myeventclass.invokeevent();
        myeventclass.customevent -= new eventclass.customeventhandler(customevent2);
        myeventclass.invokeevent();
        myeventclass.load += new eventclass.customeventhandler(load1);
        myeventclass.onload();
    }
    ** static void customevent1(object sender, eventargs e)
    {
        console.writeline("fire event 1");
    }
    ** static void customevent2(object sender, eventargs e)
    {
        console.writeline("fire event 2");
    }
    ** static void load1(object sender, eventargs e)
    {
        console.writeline("current background color is {0}. please input:", system.console.backgroundcolor.tostring());
    }
}
public class eventclass
{
    public delegate void customeventhandler(object sender, eventargs e);//首先定義一個委託類型的對象customeventhandler
    //用delegate數據類型聲明事件,要用event關鍵字,這裏定義了兩個字件;
    public event customeventhandler customevent;
    public event customeventhandler load;
        
    public void invokeevent()
    {
        customevent(this, eventargs.empty);
    }
    public void onload()
    {
        console.backgroundcolor = consolecolor.red;
        load(this, eventargs.empty);
        string s = console.readline();
        if (s != "yuping")
        {
            console.writeline("you must type 'yuping' for change it !");
        }
        else
        {
            console.backgroundcolor = system.consolecolor.black;
            console.clear();
        }
    }
}
  在包含事件聲明的類中,聲明一個數據類型是委託的這麼樣的一個對象customeventhandler, 它有兩個參數(sender和e);在這裏使用委託的目的就是在運行中向參數傳遞方法,並由委託對象生成的實例接收這個參數方法的返回值,因此,在聲明委託型的對象時應根據類中的方法結構來定義,或者說在引用類中應當根據委託型對象的結構來生成響應事件的方法結構,比如兩者都有哪些類型的參數、返回值的類型,也就是說兩者要保持一致。同時,要正確地使用c#中的委託,就必須保持三個步驟:聲明——實例化——調用。
        
  在上面的代碼中,eventclass 類就體現了這個原則:
  1. 聲明委託類型的對象: public delegate void customeventhandler(object sender, eventargs e);
  2. 創建customeventhandler對象的實例customevent:public event customeventhandler customevent;
  3. 在invokeevent()方法中實現了對該事件的調用,引用事件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章