c中如何深入理解「事件與委託」

2021-03-04 09:58:15 字數 3443 閱讀 6563

c#中如何深入理解「事件與委託」?(初學者必看)

2023年01月19日星期六 22:57

事件是特殊的委託(這是個人理解)

首先介紹乙個為什麼要在事件中引入委託這個概念:

事件是物件傳送的訊息,以發訊號通知操作的發生。操作可能是由使用者互動(例如滑鼠單擊)引起的,也可能是由某些其他的程式邏輯觸發的。引發事件的物件稱為事件傳送方。

捕獲事件並對其作出響應的物件叫做事件接收方。

在事件通訊中,事件傳送方類不知道哪個物件或方法將接收到(處理)它引發的事件。所需要的是在源和接收方之間存在乙個媒介(或類似指標的機制)。.*** framework 定義了乙個特殊的型別(delegate),該型別提供函式指標的功能。

原理簡介:

在c#中,乙個類可以有域(fields)、屬性(properties)、方法(methods)、索引(indexs)、事件(events),以及委託(delegate)等成員,其中事件(events)成員就是用來宣告乙個類事件的。在類中宣告乙個事件成員一般採用如下的語法形式:

public event **名事件名

如在某個類中申明乙個myclick事件成員,其語法如下:

public event delegatename(自定義的乙個委託) myclick;

在c#中,增加了乙個新的資料型別delegate(代表)來解決事件處理問題。代表資料型別非常類似於c語言中的指標,其與指標不同的是,其是**是安全的,可管理的。這裡是

delegatename可以是系統已經提供的**eventhandler,也可以是自己預先定義好的委託,

委託的定義如下:

public delegate [返回值] delegatename(委託的名字)(引數列表……..)

(它可以放在類外面,也可以放到類中,只要能在**中訪問到即可)

這裡注意:如果是這個委託為事件而申明的,這裡的返回值的型別就只能是void型別的,否則就要出現問題.

在c#中,通過使用delegate,你可以通過「+=」(加等於)操作符非常容易地為.***物件中的乙個事件新增乙個甚至多個響應方法;還可以通過非常簡單的「-=」(減等於)操作符取消這些響應方法。如下面為temp按鈕新增click事件的語句:

在上面宣告事件的語句中,eventhandler是乙個delegate(代表)型別,其在.***類庫中如下宣告的:

public delegate void eventhandler(object sender,eventargs e);

這樣,所有形如:void 函婁名(object 引數名,eventargs 引數名);的函式都可以作為control類的click事件響應方法了。如下面所定義的乙個事件響應方法:

private void button1_click(object sender, system.eventargs e)

由於是通過delegate(代表型別)來處理事件,因此,可能通過累加使乙個事件具有多個響應方法;與此同時,還可以使乙個方法作為多個事件的響應方法。(注意:在c#語言類中的event成員後面只能出現「+=」與「-=」兩個表示新增與取消事件響應函式的操作符。

)不管是還是一般的windows forms 程式設計,在c#中,基本上我們遇到的事件響應方法都是說明成如下的形式:

private void button1_click(object sender, system.eventargs e)

(參考其他資料)

乙個事件響應方法的訪問許可權、返回值型別、引數及型別甚至方法名稱等是否都必須固定不變呢?答案是:不是!

一般情況下,事件的響應方法中都有兩個引數,其中乙個代表引發事件的物件即sender,由於引發事件的物件不可預知的,因此我們把其宣告成為object型別,所有的物件都適用。第二個引數代表引發事件的具體資訊,各種型別的事件中可能不同,這要根據類中事件成員的說明決定。

我們知道,事件是通過delegate(代表) 來處理的。假設將要表示事件的代表說明成如下形式:

delegate int myeventhandler(object sender, *******buttonclickeventargs e);

則當涉及上面的事件響應函式宣告時,就須要宣告成如下的形式:

private int mytest(object sender,*******buttonclickeventargs e)

在給物件新增事件響應方法時就可以用如下的**實現:

control.event+=new myeventhandler(mytest);

下面是我根據對委託的理解,自己編寫的**,

注意目的是為了深入理解事件是怎樣和委託結合的。我的想法是這樣的:既然microsft已經為button按鈕寫了onclick事件了(不傳遞任何引數進入事件),我就打算重新新增乙個myclick事件,當按鈕的onclick事件發生的時候,我就重寫預設的onclick事件,執行自己新增的myclick事件,並傳遞引數進入事件(myclick)中進行處理。

首先新增乙個自定義的按鈕mybutton,它繼承於system.window.forms.button類的.**如下:

namespace exampleaddeventform

public event mydelegate mydelegateevent;//申明乙個事件

public void triggerevent()

}} }上面的myevenargs類是我自定義的類,它繼承與系統提供的system.evenargs類注意目的是為了傳入引數進入方法。

namespace exampleaddeventform

set} private string lastname;

public string lastname

set} } }

到現在為止,我們已經實現了自己的按鈕(自定義了事件和委託,並重寫了microsft為我們提供的onclick事件,執行我們的onclick事件)和onclick事件中需要的傳遞引數的myevenargs類

下面就把我們寫的mybutton按鈕放到頁面上(不是拖放到頁面上,這是不可能的),我們至少都要在initialize***ponent方法中載入到頁面上

private mybutton mybutton

private void initialize***ponent()

這時回到設計介面提示錯誤(這是正常的)(沒有重新整理)。從這裡可以看到

mybutton.mydelegateevent += new mydelegate(mybutton_click);

這句話就是註冊事件,用自定義button中事件執行mybutton_click函式方法,其實這就是事件處理程式。

返回到後台**的如下:(這裡只是簡單的提示有用的訊息) public void mybutton_click(object sender, myevenargs message)

現在**就結束了,執行程式就彈出「this is a custom button』s click」的提示

這裡我主要理解了事件的機制和原理,有什麼不正確的請朋友們及時的提出,一起討論,共同進步。

深入理解C語言指標的奧秘

指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 int ptr 2 char ...

深入理解Linux fork函式

2014 08 08 2015 02 12 程序必須的4個要點 a 要有一段程式供該程序執行,就像一場戲劇要有乙個劇本一樣。該程式是可以被多個程序共享的,多場戲劇用乙個劇本一樣 b 有起碼的私有財產,就是程序專用的系統堆疊空間 c 有 戶口 既作業系統所說的程序控制塊,在linux中具體實現是tas...

利用助學,深入理解文字

作者 程菊香 新語文學習 教師 2013年第03期 隨著新課改的深入,越來越多的教師在文字閱讀教學過程中開始重視開發和文字相關的資源來幫助學生進行有效閱讀,以期讓學生能更深入地走進文字,與文字 作者 編者進行對話,從而能深入文字的核心,完成真正意義上的閱讀,實現課堂教學的有效生成。與文字相關的資源很...