C#中的委托、事件學(xué)習(xí)筆記
1.委托delegate
委托delegate也是一種類(lèi)型,在任何可以聲明類(lèi)的地方都可以聲明委托,它將方法當(dāng)做另一個(gè)方法的參數(shù)進(jìn)行傳遞,這樣就可以傳遞不同的方法,完成不同的功能,使程序具有很好的可擴(kuò)展性。
舉例:
假設(shè)這里有一臺(tái)電腦,有人會(huì)用它寫(xiě)程序,有人會(huì)用它打游戲,有人會(huì)用它看電影,有人會(huì)用它邊聽(tīng)音樂(lè)邊玩游戲,有人會(huì)用它邊聽(tīng)音樂(lè)邊看文檔,邊上QQ。
這臺(tái)電腦可以抽象成一個(gè)類(lèi)Computer,里面有個(gè)方法DoWork,所有的人都要通過(guò)這個(gè)方法來(lái)做自己的事情。
不用委托的時(shí)候我們可以實(shí)現(xiàn)一些固定的東西,不夠靈活:
例如:
class Program {
static void Main(string[] args) {
Computer computer = new Computer();
computer.DoWork("豬八戒", "在看電影!");
computer.DoWork("沙和尚", "在寫(xiě)程序!");
computer.DoWork("孫悟空", "在玩游戲!");
}
}
public class Computer {
public void DoWork(string name, string work) {
Console.WriteLine("{0}{1}", name, work);
}
}
上面的代碼,很死板,調(diào)用DoWork的時(shí)候只能做一件事情。
所以下面輪到委托登場(chǎng)了。
代碼如下:
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}在聽(tīng)音樂(lè)!", name);
Console.WriteLine("{0}在玩游戲!", name);
}
static void Do2(string name) {
Console.WriteLine("{0}在聽(tīng)音樂(lè)!", name);
Console.WriteLine("{0}在寫(xiě)代碼!", name);
}
}
public class Computer {
public void DoWork(string name, WorkEventHandle Work) {
Work(name);
}
}
委托總結(jié):
優(yōu)點(diǎn):委托可以作為方法的一個(gè)參數(shù)來(lái)傳遞。誰(shuí)要調(diào)用Computer里的DoWork來(lái)完成自己的事情,誰(shuí)就實(shí)現(xiàn)委托綁定的方法,這樣就可以按照自己的需求傳遞不同的方法,使程序具有了很好的擴(kuò)展性。
缺點(diǎn):我們可以隨意的給委托進(jìn)行賦值,這樣就破壞了程序的封裝性。
2. 事件
為了彌補(bǔ)委托的缺陷,所以事件出現(xiàn)了,我們只能對(duì)事件進(jìn)行“+=”和“-=”操作,不可以對(duì)事件進(jìn)行賦值(=)操作。
上面的實(shí)例用事件實(shí)現(xiàn)如下:
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}在聽(tīng)音樂(lè)!", name);
Console.WriteLine("{0}在玩游戲!", name);
}
static void Do2(string name) {
Console.WriteLine("{0}在聽(tīng)音樂(lè)!", name);
Console.WriteLine("{0}在寫(xiě)代碼!", name);
}
}
public class Computer {
public event WorkEventHandle Work;
public void DoWork(string name) {
if (Work != null) {
Work(name);
}
}
}
總結(jié):
委托既可以進(jìn)行“+=”和“-=”操作,也可以進(jìn)行賦值(=)操作,委托不具有封裝性
事件只可以進(jìn)行“+=”和“-=”操作,事件具有封裝性。
相關(guān)文章
C#中DataTable實(shí)現(xiàn)篩選查詢(xún)的示例
本文主要介紹了C#中DataTable實(shí)現(xiàn)篩選查詢(xún)的示例,主要是DataTable進(jìn)行過(guò)濾篩選,常用的一些方法為:Select,dataview,具有一定的參考價(jià)值,感興趣的可以了解一下2023-04-04Linq兩個(gè)List集合取交集的實(shí)現(xiàn)
這篇文章主要介紹了Linq兩個(gè)List集合取交集的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12WinForm使用DecExpress控件中的ChartControl插件繪制圖表
這篇文章介紹了WinForm使用DecExpress控件中的ChartControl插件繪制圖表的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05C#開(kāi)發(fā)Windows UWP系列之布局面板RelativePanel
這篇文章介紹了C#開(kāi)發(fā)Windows UWP系列之布局面板RelativePanel,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C# 設(shè)計(jì)模式系列教程-狀態(tài)模式
狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)移到表示不同的一系列類(lèi)當(dāng)中,可以把復(fù)雜的邏輯判斷簡(jiǎn)單化。2016-06-06