C# 委託、事件 學習

來源:互聯網
上載者:User
 

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);
}
}
}

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


      

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.