C委託和事件

2022-11-24 20:54:02 字數 2870 閱讀 9177

c#委託,事件理解入門 (譯稿)

目錄 ● 導論

● 什麼是委託

● 事件的理解

● 事件關鍵字

● 最後

導論在學習c#中的委託和事件過程中,我讀了許多文章來理解他們二者究竟是怎麼一回事,以及如何使用他們,現在我將整個的理解過程陳述以下,我學到的每一方面,恐怕也是你們需要掌握的 :-)。

什麼是委託?

委託和事件這兩個概念是完全配合的。委託僅僅是函式指標,那就是說,它能夠引用函式,通過傳遞位址的機制完成。委託是乙個類,當你對它例項化時,要提供乙個引用函式,將其作為它建構函式的引數。

每乙個委託都有自己的簽名,例如:delegate int somedelegate(string s, bool b);是乙個委託申明,在這裡,提及的簽名,就是說somedelegate 這個委託有 string 和 bool 型別的形參,返回乙個int 型別。

上面提及的:當你對委託例項化時,要提供乙個引用函式,將其作為它建構函式的引數。這裡要注意了:被引用的這個函式必須和委託有相同的簽名。

看下面的函式:

private int somefunction(string str, bool bln)

你可以把這個函式傳給somedelegate的建構函式,因為他們有相似的簽名(in other words,他們都有相同的形參型別和個數,並且返回相同的資料型別)。

somedelegate sd = new somedelegate(somefunction);

sd 引用了 somefunction,也就是說,somefunction已被sd所登記註冊,如果你呼叫 sd,somefunction 這個函式也會被呼叫,記住:我所說 somefunction的含義,後面,我們會用到它。

現在,你應該知道如何使用委託了,讓我們繼續理解事件之旅……

事件的理解

我們知道,在c#中:

● 按鈕(button)就是乙個類,當我們單擊它時,就觸發一次click事件。

● 時鐘(timer)也是乙個類,每過一毫秒,就觸發一次tick事件。

讓我們通過乙個例子來學習,假定有這樣的情節:

現在有乙個counter的類,它有乙個方法 countto(int countto, int reachablenum),該方法表示:在指定的時間段內(0~~countto),當到達指定的時間點reachablenum時,就觸發一次numberreached事件。

它還有乙個事件:numberreached,事件是委託型別的變數。意思是:如果給事件命名,用event關鍵字和要使用的委託型別申明它即可,如下所示:

public event numberreachedeventhandler numberreached;

在上面的申明中,numberreachedeventhandle 僅是乙個委託,更確切的表示應該是:numberreacheddelegate。但是微軟從不這樣認為mousedelegate或者paintdelegate,,而是稱謂:

mouseeventhandler 或者 painteventhandler。所以

numberreachedeventhandler 比numberreacheddelegate聽起來更方便一些,ok?好了,讓我們繼續,現在你知道了,在我們宣告事件之前,需要象下面這樣的形式來定義委託:

public delegate void numberreachedeventhandler(object sender, numberreachedeventargs e);

現在宣告的委託 numberreachedeventhandle,它有乙個void 返回值,和object,numberreachedeventargs兩個形參。就像我們在第一節中強調的那樣,當例項化委託時,作為實參傳入的函式也必須擁有和委託同樣的簽名。

在你的**中, 你是否用過painteventargs 或者 mouseeventargs來確定滑鼠的移動位置?是否在觸發paint事件的物件中用過graphics 屬性?實際上,為使用者提供資料的類都是繼承於類,就是我們常說的事件引數類,如果事件不提供引數,就不定義該類。

在我們的例子中,我們通過下面的類提供預期的時間點。

public class numberreachedeventargs : eventargs

public int reachednumber

}} 好,有了前面的介紹,讓我們到counter類裡面看看:

namespace events

public void countto(int countto, int reachablenum)

}}protected virtual void onnumberreached(numberreachedeventargs e)

}} 在counter中,如果到達指定的時間點,就觸發一次事件,有以下幾個方面需要注意:

● 通過呼叫numberreached(它是numberreachedeventhandler委託的例項)來完成一次觸發事件。

numberreached(this, e); 通過這種方式,可以呼叫所有的註冊函式。

● 通過 numberreachedeventargs e = new numberreachedeventargs(reachablenum); 為所有的註冊函式提供事件資料。

● 看了上面的**,你可能要問了:為什麼我們直接用 onnumberreached(numberreachedeventargs e)方法來呼叫numberreached(this,e),而不用下面的**呢?

if(ctr == reachablenum)

return;//don't count any more

} 這個問題問得很好,那就讓我們再看一下onnumberreached 簽名:

protected virtual void onnumberreached(numberreachedeventargs e)

C中的委託和事件

c 中的委託和事件 精闢 將方法作為方法的引數 我們先不管這個標題如何的繞口,也不管委託究竟是個什麼東西,來看下面這兩個最簡單的方法,它們不過是在螢幕上輸出一句問候的話語 public void greetpeople string name public void englishgreeting ...

C中的委託和事件

什麼是委託?為什麼要使用委託?引言本文中,我將通過兩個範例由淺入深地講述什麼是委託 為什麼要使用委託 事件的由來 net framework中的委託和事件 委託和事件對observer設計模式的意義,對它們的中間 也做了討論。將方法作為方法的引數 我們先不管這個標題如何的繞口,也不管委託究竟是個什麼...

C委託事件

有事件,就會有對事件進行處理的方法,而事件和處理方法之間是怎麼聯絡起來的呢?委託就是他們中間的橋梁,事件發生時,委託會知道,然後將事件傳遞給處理方法,處理方法進行相應處理。事件的型別一定是委託,委託為引發事件的類擔當事件傳送器的角色 比如在winform中最常見的是按鈕的click事件,它是這樣委託...