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事件,它是這樣委託...