程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#學習日記24----事件(event)

C#學習日記24----事件(event)

編輯:C#入門知識

C#學習日記24----事件(event)


事件為類和類的實例提供了向外界發送通知的能力,實現了對象與對象之間的通信,如果定義了一個事件成員,表示該類型具有 1.能夠在事件中注冊方法 (+=操作符實現)。 2.能夠在事件中注銷方法(-=操作符實現)。 3.當事件被觸發時注冊的方法會被通知(事件內部維護了一個注冊方法列表)。委托(Delegate)是事件(event)的載體,要定義事件就的要有委托。 有關委托的內容請點擊 委托(Delegate) 進入了解。

 

聲明一個事件:

在類的內部聲明事件,首先必須聲明該事件的委托類型。例如:

     pulic delegate void MyDelegateHandler(object sender,EventArgs e);

然後基於上面的例子,再聲明事件,使用關鍵字 event

pulic event MyDelegateHandler MyEvent;

   (object類型是所有類的基類,有關他的詳情前面已經說過了點擊 object類型 進入了解,EventArgs 是包含事件數據的類的基類,用於傳遞事件的細節。)

 

寫一個事件實例:

  每周的星期六我有一個雷打不動的習慣,喜歡去學校外面的一個超市買東西,那家超市有一個自動門,就是當我們走近一定距離(3米)的時候會自動打開,還會十分溫柔與親切的說“歡迎光臨”,因為我經常去他家買東西,辦理了會員,所以每當我走近的時候自動門好像認識我,非常熱情的說“熱烈歡迎HC666光臨本超市^_^”這個門倒是挺好玩那大笑

上面的例子中將“自動門”看作一個由Door實例化的對象,“我”是一個由person實例化的對象,當我調用“去超市”的動作,並且距離超市門口3米的時候,觸發我們定義的“Enterdoor”事件,然而Enterdoor裡面使用委托注冊了一個“自動門(door)”的“開門(Opendoor)”動作,相當於調用了開門方法,這樣就達到了對象與對象之間的通信與交流,代碼如下: 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace Test
{ //定義一個person類,裡面包含了方法
    class person 
    {
        public string name = HC666;
        private int distance;
        //聲明委托
        public delegate void EnterdoorHandler(object sender,EnterdoorArgs e);
        //基於委托聲明事件
        public event EnterdoorHandler Enterdoor;
        //定義的一個去超市的方法,當距離 distance<=3的時候觸發事件
        public void GotoStore()
        {
            for (int i = 6; i > 0; i--)
            {
                distance = i;
                if (i <= 3)
                {//觸發事件了
                    EnterdoorArgs e = new EnterdoorArgs(distance);
                    OnEnterdoor(e);//調用觸發事件方法
                }
            }
        
        }
        public void OnEnterdoor(EnterdoorArgs e)
        {//調用事件裡注冊的方法
            if (Enterdoor != null)
                Enterdoor(this, e);
            else
                Console.WriteLine(沒有添加處理方法);        
        }
        //定義一個包含事件數據的類,這裡distance是一個判斷的重要數據
       public class EnterdoorArgs:EventArgs
       {
           public int distance;
           public EnterdoorArgs(int distance)
           {
               this.distance = distance;
           }
       }
    }
    //定義門這個類
    class Door
    {//定義開門的方法
        public void Opendoor(object sender, person.EnterdoorArgs e)
        {
            person per = (person)sender;  //有點熟悉吧,顯示類型轉換中有談到
            if (e.distance == 3)
            {
                Console.WriteLine(尊敬的顧客您距離本超市 {0}米 即將開門迎接您, e.distance);
            }
            if(e.distance <3)
                Console.WriteLine(熱烈歡迎 {0} 光臨本超市, per.name);
            
        }
    }
    class program
    {
        static void Main(string[] args)
        {
            person per = new person(); //實例化對象
            Door door = new Door();
            //向事件中注冊開門的方法
            per.Enterdoor += door.Opendoor;
            //我去超市
            per.GotoStore();

        }
    }
}


結果:

\

 

 

      

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved