C#中委托和事件的區(qū)別實例解析
本文實例分析了C#中委托和事件的區(qū)別,分享給大家供大家參考之用。具體如下:
大致來說,委托是一個類,該類內(nèi)部維護(hù)著一個字段,指向一個方法。事件可以被看作一個委托類型的變量,通過事件注冊、取消多個委托或方法。本篇分別通過委托和事件執(zhí)行多個方法,從中體會兩者的區(qū)別。
一、通過委托執(zhí)行方法
class Program { static void Main(string[] args) { Example example = new Example(); example.Go(); Console.ReadKey(); } } public class Example { public delegate void DoSth(string str); internal void Go() { //聲明一個委托變量,并把已知方法作為其構(gòu)造函數(shù)的參數(shù) DoSth d = new DoSth(Print); string str = "Hello,World"; //通過委托的靜態(tài)方法Invoke觸發(fā)委托 d.Invoke(str); } void Print(string str) { Console.WriteLine(str); } }
上述代碼實現(xiàn):
① 在CLR運(yùn)行時,委托DoSth實際上就一個類,該類有一個參數(shù)類型為方法的構(gòu)造函數(shù),并且提供了一個Invoke實例方法,用來觸發(fā)委托的執(zhí)行。
② 委托DoSth定義了方法的參數(shù)和返回類型
③ 通過委托DoSth的構(gòu)造函數(shù),可以把符合定義的方法賦值給委托
④ 調(diào)用委托的實例方法Invoke執(zhí)行了方法
但實際上讓委托執(zhí)行方法還有另外一種方式,那就是:委托變量(參數(shù)列表)
public class Example { public delegate void DoSth(object sender, EventArgs e); internal void Go() { //聲明一個委托變量,并把已知方法作為其構(gòu)造函數(shù)的參數(shù) DoSth d = new DoSth(Print); object sender = 10; EventArgs e = new EventArgs(); d(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } }
上述代碼實現(xiàn):
① 委托DoSth的參數(shù)列表和方法Print的參數(shù)列表還是保持一致
② 委托DoSth中的參數(shù)object sender通常用來表示動作的發(fā)起者,EventArgs e用來表示動作所帶的參數(shù)。
而實際上,委托變量(參數(shù)列表),事件就是采用這種形式執(zhí)行方法的。
二、通過事件執(zhí)行方法
public class Example { public delegate void DoSth(object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { //聲明一個委托變量,并把已知方法作為其構(gòu)造函數(shù)的參數(shù) DoSth d = new DoSth(Print); object sender = 10; EventArgs e = new EventArgs(); myDoSth += new DoSth(d); myDoSth(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } }
上述代碼實現(xiàn):
① 聲明了事件myDoSth,事件的類型是DoSth這個委托
② 通過+=為事件注冊委托
③ 通過DoSth委托的構(gòu)造函數(shù)為事件注冊委托實例
④ 采用委托變量(參數(shù)列表)這種形式,讓事件執(zhí)行方法
而且,通過+=還可以為事件注冊多個委托。
public class Example { public delegate void DoSth(object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { //聲明一個委托變量,并把已知方法作為其構(gòu)造函數(shù)的參數(shù) DoSth d = new DoSth(Print); DoSth d1 = new DoSth(Say); object sender = 10; EventArgs e = new EventArgs(); //為事件注冊多個委托 myDoSth += new DoSth(d); myDoSth += new DoSth(d1); myDoSth(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } void Say(object sender, EventArgs e) { Console.WriteLine(sender); } }
以上,通過+=為事件注冊1個或多個委托實例,實際上,還可以為事件直接注冊方法。
public class Example { public delegate void DoSth(object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { object sender = 10; EventArgs e = new EventArgs(); //為事件注冊多個委托 myDoSth += Print; myDoSth += Say; myDoSth(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } void Say(object sender, EventArgs e) { Console.WriteLine(sender); } }
三、通過EventHandler執(zhí)行方法
先來看EventHandler的源代碼。
public delegate void EventHandler(object sender, System.EventArgs e);
可見,EventHandler就是委托?,F(xiàn)在就使用EventHandler來執(zhí)行多個方法。
public class Example { public event EventHandler myEvent; internal void Go() { object sender = 10; EventArgs e = new EventArgs(); //為事件注冊多個委托 myEvent += Print; myEvent += Say; myEvent(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } void Say(object sender, EventArgs e) { Console.WriteLine(sender); } }
總結(jié):
① 委托就是一個類,也可以實例化,通過委托的構(gòu)造函數(shù)來把方法賦值給委托實例
② 觸發(fā)委托有2種方式: 委托實例.Invoke(參數(shù)列表),委托實例(參數(shù)列表)
③ 事件可以看作是一個委托類型的變量
④ 通過+=為事件注冊多個委托實例或多個方法
⑤ 通過-=為事件注銷多個委托實例或多個方法
⑥ EventHandler就是一個委托
相信本文所述對大家C#程序設(shè)計的學(xué)習(xí)有一定的借鑒價值。
相關(guān)文章
UnityShader使用Plane實現(xiàn)翻書效果
這篇文章主要為大家詳細(xì)介紹了UnityShader使用Plane實現(xiàn)翻書效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07C#中IList<T>與List<T>的區(qū)別深入解析
本篇文章主要是對C#中IList<T>與List<T>的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01使用MSScriptControl 在 C# 中讀取json數(shù)據(jù)的方法
下面小編就為大家?guī)硪黄褂肕SScriptControl 在 C# 中讀取json數(shù)據(jù)的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01深入C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)的詳細(xì)介紹
本篇文章是對C# 4.0 新特性dynamic、可選參數(shù)、命名參數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05c#創(chuàng)建windows服務(wù)(Windows Services)詳細(xì)步驟
這篇文章主要介紹了c#創(chuàng)建windows服務(wù)(Windows Services)詳細(xì)步驟,大家參考使用吧2013-12-12C#實現(xiàn)JSON解析器MojoUnityJson功能(簡單且高效)
MojoUnityJson 是使用C#實現(xiàn)的JSON解析器 ,算法思路來自于游戲引擎Mojoc的C語言實現(xiàn) Json.h。這篇文章主要介紹了C#實現(xiàn)JSON解析器MojoUnityJson的方法,需要的朋友可以參考下2018-01-01