C# 自定義事件和委託(精彩轉載)

weixin_34304013發表於2009-12-13

c# 自定義事件和委託

  事件是類和物件向外界發出的訊息,事件的執行是通過事件委託的方式,呼叫我們所準備好的處理方法,而是先訊息的響應的。要響應某些事件並針對某些事件執行我們意定的方法,需要做到以下幾步:

        1、宣告事件委託。

        2、宣告事件。

        3、新增事件的觸發方法。

        4、新增事件的處理程式(響應事件的方法)。

        5、將指定的事件處理程式邦定到要處理的事件上(訂閱事件)。

        6、使用者資訊操作,並觸發事件(呼叫事件的觸發方法)。

        7、通過事件委託的回撥,執行我們需要的事件處理程式。

      下面我們舉一個簡單的自定義事件處理程式的例子(控制檯程式)

   namespace 事件
   {
    //釋出事件的類
    public class TestEventSource
    {
        //定義事件引數類
        public class TestEventArgs : EventArgs
        {
            public readonly char KeyToRaiseEvent;
            public TestEventArgs(char keyToRaiseEvent)
            {
                KeyToRaiseEvent = keyToRaiseEvent;
            }
        }

        //定義delegate
        public delegate void TestEventHandler(object sender, TestEventArgs e);
        //用event 關鍵字宣告事件物件
        public event TestEventHandler TestEvent;

        //事件觸發方法
        protected virtual void OnTestEvent(TestEventArgs e)
        {
            if (TestEvent != null)
                TestEvent(this, e);
        }

        //引發事件
        public void RaiseEvent(char keyToRaiseEvent)
        {
            TestEventArgs e = new TestEventArgs(keyToRaiseEvent);
            OnTestEvent(e);
        }

    }
    //監聽事件的類
    public class TestEventListener
    {
        //定義處理事件的方法,他與宣告事件的delegate具有相同的引數和返回值型別
        public void KeyPressed(object sender, TestEventSource.TestEventArgs e)
        {
            Console.WriteLine("傳送者:{0},所按得健為:{1}", sender, e.KeyToRaiseEvent);
        }

        //訂閱事件
        public void Subscribe(TestEventSource evenSource)
        {
            evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
        }
        //取消訂閱事件
        public void UnSubscribe(TestEventSource evenSource)
        {
            evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
        }
    }

    //測試類
    public class Test
    {
        public static void Main()
        {
            //建立事件源物件
            TestEventSource es = new TestEventSource();
            //建立監聽物件
            TestEventListener el = new TestEventListener();
            //訂閱事件
            Console.WriteLine("訂閱事件\n");
            el.Subscribe(es);
            //引發事件
            Console.WriteLine("輸入一個字元,再按enter鍵");
            string s = Console.ReadLine();
            es.RaiseEvent(s.ToCharArray()[0]);
            //取消訂閱事件
            Console.WriteLine("\n取消訂閱事件\n");
            el.UnSubscribe(es);

            //引發事件
            Console.WriteLine("輸入一個字元,再按enter健");
            s = Console.ReadLine();
            es.RaiseEvent(s.ToCharArray()[0]);

 

        }
    }

}

程式執行結

訂閱事件

輸入一個字元,再按enter鍵
aaaa
傳送者:事件.TestEventSource,所按得健為:a

取消訂閱事件

輸入一個字元,再按enter健

          TestEventSource類。他就相當於windows控制元件類一樣,是事件的源,裡面包含有事件的宣告,以及儲存呼叫引數的事件引數類,以及事件的觸發方法。       

         TestEventListener類。他提供了事件處理程式,並實現了事件處理程式和事件物件的邦定,當然時間處理程式可以放在別處, 跟邦定程式(訂閱事件)放在一起便於理解和呼叫

        Test 類,例項化自定義事件的事件源物件,並呼叫 TestEventListener類中的Subscribe(es);方法進行事件物件和事件處理程式的邦定(訂閱事件),呼叫 TestEventSource類中的RaiseEvent(char keyToRaiseEvent)引發物件,並有物件所指定的委託回撥處理事件。完成整個自定義事件。

           其中   RaiseEvent(char keyToRaiseEvent)      就相當於main()一樣是自定義事件的執行入口,       從這個法開始---〉呼叫事件委託----〉查詢訂閱事件程式找到事件所封裝的方法集----〉由委託回撥事件處理程式並傳遞引數---〉執行事件處理程式。


摘錄自:http://www.cnblogs.com/huomm/archive/2007/12/04/982869.html

 

淺析C#的事件處理和自定義事件 http://dev.csdn.net/develop/article/22/22951.shtm

 

http://www.cnblogs.com/BeginnerClassroom/archive/2009/01/11/1373689.html

 

相關文章