C#中委托和事件的區(qū)別實(shí)例解析
本文實(shí)例分析了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);
}
}
上述代碼實(shí)現(xiàn):
① 在CLR運(yùn)行時,委托DoSth實(shí)際上就一個類,該類有一個參數(shù)類型為方法的構(gòu)造函數(shù),并且提供了一個Invoke實(shí)例方法,用來觸發(fā)委托的執(zhí)行。
② 委托DoSth定義了方法的參數(shù)和返回類型
③ 通過委托DoSth的構(gòu)造函數(shù),可以把符合定義的方法賦值給委托
④ 調(diào)用委托的實(shí)例方法Invoke執(zhí)行了方法
但實(shí)際上讓委托執(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);
}
}
上述代碼實(shí)現(xiàn):
① 委托DoSth的參數(shù)列表和方法Print的參數(shù)列表還是保持一致
② 委托DoSth中的參數(shù)object sender通常用來表示動作的發(fā)起者,EventArgs e用來表示動作所帶的參數(shù)。
而實(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);
}
}
上述代碼實(shí)現(xiàn):
① 聲明了事件myDoSth,事件的類型是DoSth這個委托
② 通過+=為事件注冊委托
③ 通過DoSth委托的構(gòu)造函數(shù)為事件注冊委托實(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個或多個委托實(shí)例,實(shí)際上,還可以為事件直接注冊方法。
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就是委托。現(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é):
① 委托就是一個類,也可以實(shí)例化,通過委托的構(gòu)造函數(shù)來把方法賦值給委托實(shí)例
② 觸發(fā)委托有2種方式: 委托實(shí)例.Invoke(參數(shù)列表),委托實(shí)例(參數(shù)列表)
③ 事件可以看作是一個委托類型的變量
④ 通過+=為事件注冊多個委托實(shí)例或多個方法
⑤ 通過-=為事件注銷多個委托實(shí)例或多個方法
⑥ EventHandler就是一個委托
相信本文所述對大家C#程序設(shè)計(jì)的學(xué)習(xí)有一定的借鑒價值。
相關(guān)文章
C#中基數(shù)排序算法的原理及實(shí)現(xiàn)
基數(shù)排序算法是一種非比較式的排序方法,通過分配和收集步驟對數(shù)字的每一位進(jìn)行排序,學(xué)習(xí)基數(shù)排序有助于提高排序效率,解決特定問題,廣泛應(yīng)用于多個領(lǐng)域如數(shù)據(jù)分析和數(shù)據(jù)庫索引建立等2024-10-10
C#畫筆Pen保存和恢復(fù)圖形對象的設(shè)置方法
這篇文章主要介紹了C#畫筆Pen保存和恢復(fù)圖形對象的設(shè)置方法,實(shí)例分析了畫筆的保存save及恢復(fù)屬性Restore的相關(guān)使用技巧,需要的朋友可以參考下2015-06-06
C#實(shí)現(xiàn)六大設(shè)計(jì)原則之依賴倒置原則
這篇文章介紹了C#實(shí)現(xiàn)六大設(shè)計(jì)原則之依賴倒置原則的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)示例詳解
這篇文章主要給大家介紹了關(guān)于C#中參數(shù)數(shù)組、引用參數(shù)和輸出參數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
C#實(shí)現(xiàn)的自定義郵件發(fā)送類完整實(shí)例(支持多人多附件)
這篇文章主要介紹了C#實(shí)現(xiàn)的自定義郵件發(fā)送類,具有支持多人多附件的功能,涉及C#郵件操作的相關(guān)技巧,需要的朋友可以參考下2015-12-12

