1. 程式人生 > >委託事件入門

委託事件入門

作者:王俊傑
連結:https://www.zhihu.com/question/21638630/answer/32794112
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

 

 

有這麼一個故事吧!

附上原始碼:

using System;
 
namespace 起床事件
{
    class 主程式
    {
        static void Main(string[] args)
        {
            /* 專案場景描述:
             * 我從明天早上開始要早起晨讀,室友每天都七點起床晨跑,我告訴他明天起來的時候把我叫醒,並讓我晨讀
             * PS:還有個王八犢子非要跟我賭五毛我起不來,還讓明天室友也叫他,見證我到底有沒有起來
             */
 
            //首先你們三個得存在吧
            var 中國好室友 = new 室友();
            var 我 = new 要晨讀的我();
            var 王八犢子 = new 王八犢子();
 
            //我先告訴室友:我要早起晨讀
            中國好室友.叫別人起床該幹嘛幹嘛 += 我.起床晨讀;
            //王八犢子來攪屎了
            中國好室友.叫別人起床該幹嘛幹嘛 += 王八犢子.賭五毛起不來;
            //於是第二天到了
            Console.WriteLine("鬧鈴:早上七點鐘...");
            Console.WriteLine("系統提示:室友起床了!");
            Console.WriteLine();
           中國好室友.起床晨跑去();
            Console.WriteLine();
            Console.WriteLine("==========全劇終==========");
 
            Console.ReadLine();
        }
 
        public delegate void 這是一個委託();
 
        public class 室友
        {
            public void 起床晨跑去()
            {
                Console.WriteLine("室友:喂,起床啦!");
                Console.WriteLine("");
                if (叫別人起床該幹嘛幹嘛 != null) //如果有人委託我什麼
                {
                  叫別人起床該幹嘛幹嘛();
                }
                Console.WriteLine("室友:完事走人,晨跑去!");
            }
 
            public event 這是一個委託 叫別人起床該幹嘛幹嘛;
 
        }
 
        public class 要晨讀的我
        {
            public void 起床晨讀()
            {
                Console.WriteLine("我:哦,起來了!!!");
                Console.WriteLine("我:一二三四五,上網看知乎,刷完知乎再晨讀!");
                Console.WriteLine();
            }
        }
 
        public class 王八犢子
        {
            public void 賭五毛起不來()
            {
                Console.WriteLine("王八犢子:五毛拿走,勞資要碎覺!");
                Console.WriteLine();
            }
        }
    }
}

覺得這樣直接貼程式碼,不做解釋的話,可能還令人不太理解,再補充下概念。

方法:具體去做什麼事實際內容,可以是早讀,晨跑,或者是叫別人起床。

委託:將方法當做值。就像整數型值3能賦給一個int型別的變數,方法可以賦值給相同引數的委託型別變數。通過關鍵字delegate定義。

事件:一個需要先定義的委託型別關鍵字event來定義。具體就是可以承載方法。

事件的用法:不講編譯器幫我們做的正規使用方法,因為我自己也不太清楚。直接用語法糖,事件變數 += 需要掛接的方法.然後就是在內部處理,何時去觸發這個事件了 事件變數() ,當然其形參的定義就看委託型別的定義了,亦可以將事件變數裡面的掛接的方法逐個處理,這就等理解事件

並能簡單實用後,再去查資料啦~~

PS:可能我理解的有些誤區,但管他呢我知道這麼用能完成我的需求。原理什麼的想知道的話看書去啦!

如果你用過C/C++ 的函式指標,那麼跟你說委託就是函式指標,事件就是儲存多個函式指標的陣列就夠了。