天天看點

ASP.NET深入淺出系列4- 也談委托和事件

這個話題已經很多人談過了,本不想重複拿出來說,但為了這個系列的完整性,我便把自己以前積累的東西整理了一下,大家全當消遣了。

<a href="http://nuaalfm.cnblogs.com/">作者:方明</a>

一、委托的定義:

《進階漢語大詞典》中是如下解釋的:托付給别的人或機構辦理。要說生活中的意思其實大家都能了解,無非是“當某人(機構)需要完成一件自己不能或不應該完成的事情的時候,此人(機構)物色一個合适的且有能力完成此事的人選,然後提供必要的資訊,将此事委托給物色到的人(機構)來完成。” C#中的委托是一種引用方法的類型,一旦為委托配置設定了方法,委托将與該方法具有完全相同的行為,委托方法的使用可以像其他任何方法一樣具有參數和傳回值。委托對象能被傳遞給調用該方法引用的代碼而無須知道哪個方法将在編譯時被調用。委托是函數的封裝,它代表一“類”函數。他們都符合一定的簽名:擁有相同的參數清單、傳回值類型。同時委托也可以看作是對函數的抽象,是函數的“類”。此時,委托執行個體代表一個具體的函數。委托應該和類同屬一個層面,使用起來也很象一個類。我們先來看一個委托使用的執行個體:

ASP.NET深入淺出系列4- 也談委托和事件

Code

得到的結果為

Hello World!

myHandler==null

二、委托的特點

1、一個委托對象可以搭載多個方法。

2、一個委托對象搭載的方法并不需要屬于同一個類,但所搭載的方法必須具有相同的原形和形式。

3、委托的執行個體将代表一個具體的函數

三、為什麼要使用委托

1、更加靈活的方法調用。我們先舉一個例子:

ASP.NET深入淺出系列4- 也談委托和事件

這個例子中用戶端會根據不同的情況對檔案進行備份

2、用于異步回調

由于執行個體化委托是一個對象,是以可以将其作為參數進行傳遞,也可以将其指派給屬性。這樣方法就可以将一個委托作為參數來接受,并且以後可以調用該委托。這稱為異步回調,是在較長的程序完成後用來通知調用方的常用方法,以這種方式使用委托時,使用委托的代碼無需了解有關使用方法的實作方面的任何資訊。

我們假設這樣一個場景,我們希望有這樣一個函數,對一個整型數組進行過濾,而過濾得條件在編寫函數時還不知道,直到使用這個函數的時候可以根據目前的情況編寫過濾條件函數,我們使用委托實作如下:

ASP.NET深入淺出系列4- 也談委托和事件

結果為:

1

3

5

7

9

 3、多線程程式設計中使用委托來指定啟動一個線程時調用的方法

ASP.NET深入淺出系列4- 也談委托和事件

4、C#中的事件模型。用他們指明處理給定事件的方法。

下面我們詳細來介紹事件。

四、事件

事件允許類型(或者類型的執行個體)在某些特定事情發生的時候通知其他對象。

例如button類定義了一個名為click的事件,當buton對象被點選時,應用程式中的一些對象可能希望能夠收到一個通知,并執行一些動作。但問題是當我們編寫button類的時候并不知道到底要做什麼,到底要調用哪些方法,我們隻要在使用button的場景才知道到底應該在按下button時做些什麼,基于這樣的情況,我們想起了委托,我們先在button類中定義一個委托,然後在使用button的相應場景注冊這個委托即可,似乎用委托就解決了這個問題了,那事件還有什麼用呢,也就是說委托和事件的差別在哪裡呢,其實事件就是一種特殊的委托,使用事件委托的類型,必須使用+=進行注冊而不能用=,這樣做的原因是事件中已經注冊的方法不希望被新注冊的方法覆寫掉。微軟為使用事件定義了一個模式。

事件模式由以下五步組成:

1、定義一個類型用于儲存所有需要發送給事件通知接受者的附加資訊(繼承于System.EventArgs)

2、定義一個委托類型,用于指定事件觸發時被調用的方法類型

3、定義一個事件成員

4、定義一個受保護的虛方法,負責通知事件的登記對象

5、定義一個方法,将輸入轉化為期望的事件

我們這裡舉一個發Email的時候觸發事件的例子:

ASP.NET深入淺出系列4- 也談委托和事件

ps:使用EventHandler&lt;(Of &lt;(TEventArgs&gt;)&gt;) 泛型委托 實作事件(來自msdn)

ASP.NET深入淺出系列4- 也談委托和事件

 這個話題已經很多人談過了,本不想重複拿出來說,但為了這個系列的完整性,我便把自己以前積累的東西整理了一下,大家全當消遣了。

ASP.NET深入淺出系列4- 也談委托和事件
ASP.NET深入淺出系列4- 也談委托和事件
ASP.NET深入淺出系列4- 也談委托和事件
ASP.NET深入淺出系列4- 也談委托和事件
ASP.NET深入淺出系列4- 也談委托和事件
ASP.NET深入淺出系列4- 也談委托和事件

本文轉自 你聽海是不是在笑 部落格園部落格,原文連結:http://www.cnblogs.com/nuaalfm/archive/2008/09/15/1291291.html  ,如需轉載請自行聯系原作者

繼續閱讀