国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#中自定義事件和委托實例

2020-01-24 02:12:17
字體:
來源:轉載
供稿:網友

在windows 編程中用到最多的就是控件的事件了,微軟給我們很好的方式,把注意力放到事件執行方法的設計和編碼上,但是但我們真正弄懂了事件的真正出發執行原理的話,對我們的編程的提高真是非常榜的,例如在windows編程中 如果我單擊了一個button按鈕觸發了button 的click事件  Button1_Click(){} ,但是有時候我們編程的時候,不但想要觸發button 的單擊事件,我還想要把其他的時間也要調用下來順序執行,要實現這種方式,除了在方法最后對其他方法的調用,還可以利用將其他需要順序執行的方法封裝到button的click 事件的委托對象中,這樣就能夠順序執行毀掉方法列表中的程序了,而這種方式的實現是以清楚事件觸發和委托的調用為前提的。

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


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()一樣是自定義事件的執行入口,       從這個法開始---〉調用事件委托----〉查找訂閱事件程序找到事件所封裝的方法集----〉由委托回調事件處理程序并傳遞參數---〉執行事件處理程序。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大余县| 桐庐县| 苍溪县| 诏安县| 田东县| 咸宁市| 泗阳县| 苏尼特右旗| 长阳| 龙里县| 四平市| 洱源县| 江北区| 尉犁县| 无棣县| 天镇县| 绥江县| 科技| 娄底市| 宜宾县| 南溪县| 西吉县| 武宣县| 罗城| 门源| 江山市| 从化市| 叶城县| 镇康县| 武汉市| 得荣县| 开平市| 平度市| 黑龙江省| 泰州市| 荃湾区| 荃湾区| 西畴县| 始兴县| 始兴县| 阿鲁科尔沁旗|