溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#委托和事件怎么理解

發(fā)布時間:2021-12-01 13:59:48 來源:億速云 閱讀:148 作者:iii 欄目:編程語言

這篇文章主要介紹“C#委托和事件怎么理解”,在日常操作中,相信很多人在C#委托和事件怎么理解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#委托和事件怎么理解”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

什么是C#委托?

C#委托和C#事件這兩個概念是完全配合的。委托僅僅是函數(shù)指針,那就是說,它能夠引用函數(shù),通過傳遞地址的機(jī)制完成。委托是一個類,當(dāng)你對它實(shí)例化時,要提供一個引用函數(shù),將其作為它構(gòu)造函數(shù)的參數(shù)。

每一個委托都有自己的簽名,例如:Delegate int SomeDelegate(string s, bool b);是一個委托申明,在這里,提及的簽名,就是說SomeDelegate 這個委托 有 string 和 bool 類型的形參,返回一個int 類型。

上面提及的:當(dāng)你對委托實(shí)例化時,要提供一個引用函數(shù),將其作為它構(gòu)造函數(shù)的參數(shù)。這里要注意了:被引用的這個函數(shù)必須和委托有相同的簽名。

看下面的函數(shù):

private int SomeFunction(string str, bool bln){...}

C#事件的理解

我們知道,在C#中:
◆按鈕(Button)就是一個類,當(dāng)我們單擊它時,就觸發(fā)一次click事件。
◆時鐘(Timer)也是一個類,每過一毫秒,就觸發(fā)一次tick事件。

現(xiàn)在有一個Counter的類,它有一個方法 CountTo(int countTo, int reachableNum),該方法表示:在指定的時間段內(nèi)(0~~countTo),當(dāng)?shù)竭_(dá)指定的時間點(diǎn)reachableNum時,就觸發(fā)一次NumberReached事件。

它還有一個事件:NumberReached,C#事件是委托類型的變量。意思是:如果給事件命名,用event關(guān)鍵字和要使用的委托類型申明它即可,如下所示:

public event NumberReachedEventHandler NumberReached;

在上面的申明中,NumberReachedEventHandle 僅是一個委托,更確切的表示應(yīng)該是:NumberReachedDelegate。但是微軟從不這樣認(rèn)為MouseDelegate或者PaintDelegate,而是稱謂:MouseEventHandler 或者 PaintEventHandler。所以

NumberReachedEventHandler 比NumberReachedDelegate聽起來更方便一些,OK?好了,讓我們繼續(xù),現(xiàn)在你知道了,在我們聲明事件之前,需要象下面這樣的形式來定義委托:

public delegate void NumberReachedEventHandler(object sender, NumberReachedEventArgs e);

現(xiàn)在聲明的C#委托 NumberReachedEventHandle,它有一個void 返回值,和object,NumberReachedEventArgs兩個形參。就像我們在***節(jié)中強(qiáng)調(diào)的那樣,當(dāng)實(shí)例化委托時,作為實(shí)參傳入的函數(shù)也必須擁有和委托同樣的簽名。

在你的代碼中, 你是否用過PaintEventArgs 或者 MouseEventArgs來確定鼠標(biāo)的移動位置?是否在觸發(fā)Paint事件的對象中用過Graphics 屬性?實(shí)際上,為用戶提供數(shù)據(jù)的類都是繼承于System.EventArgs類,就是我們常說的事件參數(shù)類,如果事件不提供參數(shù),就不定義該類。在我們的例子中,我們通過下面的類提供預(yù)期的時間點(diǎn)。

public class NumberReachedEventArgs : EventArgs  {  private int _reached;  public NumberReachedEventArgs(int num)  {  this._reached = num;  }  public int ReachedNumber  {  get{  return _reached;  }  }  }

到此,關(guān)于“C#委托和事件怎么理解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI