標籤:
這篇文章主要介紹了C#中委託和事件的區別,並分別以執行個體形式展示了通過委託執行方法與通過事件執行方法,以及相關的執行流程與原理分析,需要的朋友可以參考下本文執行個體分析了C#中委託和事件的區別,分享給大家供大家參考之用。具體如下:
大致來說,委託是一個類,該類內部維護著一個欄位,指向一個方法。事件可以被看作一個委託類型的變數,通過事件註冊、取消多個委託或方法。本篇分別通過委託和事件執行多個方法,從中體會兩者的區別。
一、通過委託執行方法
| 12345678910111213141516171819202122232425 |
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() { //聲明一個委託變數,並把已知方法作為其建構函式的參數 DoSth d = new DoSth(Print); string str = "Hello,World"; //通過委託的靜態方法Invoke觸發委託 d.Invoke(str); } void Print(string str) { Console.WriteLine(str); } } |
上述代碼實現:
① 在CLR運行時,委託DoSth實際上就一個類,該類有一個參數類型為方法的建構函式,並且提供了一個Invoke執行個體方法,用來觸發委託的執行。
② 委託DoSth定義了方法的參數和傳回型別
③ 通過委託DoSth的建構函式,可以把符合定義的方法賦值給委託
④ 調用委託的執行個體方法Invoke執行了方法
但實際上讓委託執行方法還有另外一種方式,那就是:委託變數(參數列表)
| 12345678910111213141516 |
public class Example { public delegate void DoSth(object sender, EventArgs e); internal void Go() { //聲明一個委託變數,並把已知方法作為其建構函式的參數 DoSth d = new DoSth(Print); object sender = 10; EventArgs e = new EventArgs(); d(sender, e); } void Print(object sender, EventArgs e) { Console.WriteLine(sender); } } |
上述代碼實現:
① 委託DoSth的參數列表和方法Print的參數列表還是保持一致
② 委託DoSth中的參數object sender通常用來表示動作的發起者,EventArgs e用來表示動作所帶的參數。
而實際上,委託變數(參數列表),事件就是採用這種形式執行方法的。
二、通過事件執行方法
| 123456789101112131415161718 |
public class Example { public delegate void DoSth(object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { //聲明一個委託變數,並把已知方法作為其建構函式的參數 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); } } |
上述代碼實現:
① 聲明了事件myDoSth,事件的類型是DoSth這個委託
② 通過+=為事件註冊委託
③ 通過DoSth委託的建構函式為事件註冊委託執行個體
④ 採用委託變數(參數列表)這種形式,讓事件執行方法
而且,通過+=還可以為事件註冊多個委託。
| 12345678910111213141516171819202122232425 |
public class Example { public delegate void DoSth(object sender, EventArgs e); public event DoSth myDoSth; internal void Go() { //聲明一個委託變數,並把已知方法作為其建構函式的參數 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個或多個委託執行個體,實際上,還可以為事件直接註冊方法。
| 12345678910111213141516171819202122 |
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執行方法
先來看EventHandler的原始碼。
| 1 |
public delegate void EventHandler(object sender, System.EventArgs e); |
可見,EventHandler就是委託。現在就使用EventHandler來執行多個方法。
| 123456789101112131415161718192021 |
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); } } |
總結:
① 委託就是一個類,也可以執行個體化,
C#中委託和事件的區別執行個體解析