C#中委託和事件的區別執行個體解析

來源:互聯網
上載者:User

標籤:

這篇文章主要介紹了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#中委託和事件的區別執行個體解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.