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

首頁 > 編程 > C# > 正文

C#中的委托、事件學習筆記

2019-10-29 21:43:31
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C#中的委托、事件學習筆記,本文講解了委托delegate、事件的相關知識并給出代碼實例,需要的朋友可以參考下
 

1.委托delegate

委托delegate也是一種類型,在任何可以聲明類的地方都可以聲明委托,它將方法當做另一個方法的參數進行傳遞,這樣就可以傳遞不同的方法,完成不同的功能,使程序具有很好的可擴展性。

舉例:

假設這里有一臺電腦,有人會用它寫程序,有人會用它打游戲,有人會用它看電影,有人會用它邊聽音樂邊玩游戲,有人會用它邊聽音樂邊看文檔,邊上QQ。

這臺電腦可以抽象成一個類Computer,里面有個方法DoWork,所有的人都要通過這個方法來做自己的事情。

不用委托的時候我們可以實現一些固定的東西,不夠靈活:

例如:

復制代碼代碼如下:

class Program {
        static void Main(string[] args) {
            Computer computer = new Computer();
            computer.DoWork("豬八戒", "在看電影!");
            computer.DoWork("沙和尚", "在寫程序!");
            computer.DoWork("孫悟空", "在玩游戲!");
        }
    }

 

    public class Computer {
        public void DoWork(string name, string work) {
            Console.WriteLine("{0}{1}", name, work);
        }
    }

 

上面的代碼,很死板,調用DoWork的時候只能做一件事情。

所以下面輪到委托登場了。

代碼如下:

 

復制代碼代碼如下:

public delegate void WorkEventHandle(string name);

 

    class Program {
        static void Main(string[] args) {
            Computer computer1 = new Computer();
            WorkEventHandle work = Do1;
            computer1.DoWork("孫悟空", work);

            Console.WriteLine("");

            work = Do2;
            computer1.DoWork("八戒", Do2);
        }

        static void Do1(string name) {
            Console.WriteLine("{0}在上QQ!", name);
            Console.WriteLine("{0}在聽音樂!", name);
            Console.WriteLine("{0}在玩游戲!", name);
        }

        static void Do2(string name) {
            Console.WriteLine("{0}在聽音樂!", name);
            Console.WriteLine("{0}在寫代碼!", name);
        }
    }

    public class Computer {
        public void DoWork(string name, WorkEventHandle Work) {
            Work(name);
        }
    }

 

委托總結:

      優點:委托可以作為方法的一個參數來傳遞。誰要調用Computer里的DoWork來完成自己的事情,誰就實現委托綁定的方法,這樣就可以按照自己的需求傳遞不同的方法,使程序具有了很好的擴展性。

      缺點:我們可以隨意的給委托進行賦值,這樣就破壞了程序的封裝性。

2. 事件

為了彌補委托的缺陷,所以事件出現了,我們只能對事件進行“+=”和“-=”操作,不可以對事件進行賦值(=)操作。
上面的實例用事件實現如下:

 

復制代碼代碼如下:

public delegate void WorkEventHandle(string name);

 

    class Program {
        static void Main(string[] args) {
            Computer computer1 = new Computer();
            computer1.Work += new WorkEventHandle(Do1);

            computer1.DoWork("孫悟空");

            Console.WriteLine("");
            computer1.Work += new WorkEventHandle(Do2);

            computer1.DoWork("八戒");
        }


        static void Do1(string name) {
            Console.WriteLine("{0}在上QQ!", name);
            Console.WriteLine("{0}在聽音樂!", name);
            Console.WriteLine("{0}在玩游戲!", name);
        }

        static void Do2(string name) {
            Console.WriteLine("{0}在聽音樂!", name);
            Console.WriteLine("{0}在寫代碼!", name);
        }
    }

    public class Computer {
        public event WorkEventHandle Work;
        public void DoWork(string name) {
            if (Work != null) {
                Work(name);
            }
        }
    }

 

總結:

委托既可以進行“+=”和“-=”操作,也可以進行賦值(=)操作,委托不具有封裝性
事件只可以進行“+=”和“-=”操作,事件具有封裝性。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广河县| 昌乐县| 祁东县| 鹿邑县| 扶绥县| 海安县| 侯马市| 浠水县| 阿克陶县| 绥化市| 邵阳县| 福建省| 兴城市| 东乡族自治县| 内黄县| 铅山县| 绍兴市| 曲松县| 内黄县| 岗巴县| 黔江区| 三河市| 大方县| 无为县| 德安县| 韶山市| 禹州市| 耒阳市| 孟津县| 华容县| 类乌齐县| 横山县| 云安县| 金门县| 淮南市| 申扎县| 鄂温| 昌平区| 宁国市| 麻江县| 宁南县|