C 委託與事件

2021-06-26 23:36:57 字數 2392 閱讀 2257

1、委託

委託是一種

資料型別,像類一樣

,它定義了方法的型別

,使得可以

將定義的方法當作另乙個方法的引數

來進行傳遞

,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if-else(switch)語句,同時使得程式具有更好的可擴充套件性。

委託儲存的是對函式(function)的引用

,即儲存對儲存在託管堆(managed heap)中的物件的引用,

而不是實際值。

委託例項:

using system;

using system.collections.generic;

using system.linq;

using system.threading.tasks;

using system.windows.forms;

namespace delegateprogram

}}

function類 

public class function 

", msg);

}public void functionb(string msg)

", msg);

}public string fucntiont(t t, e e)

,",t,e));

}}

輸出結果:

functiona:******

functiona:a

functionb:b

functiona:c

functionb:c

functiona:d

泛型**引數值:t,e

2、事件

事件:事件是物件傳送的訊息,傳送訊號通知客戶發生了操作。這個操作可能是由滑鼠單擊引起的,也可能是由某些其他的程式邏

輯觸發的。事件的傳送方不需要知道哪個物件或者方法接收它引發的事件,傳送方只需知道它和接收方之間的中介(delegate)。

對於c#程式設計我們最常看到的乙個事件就是窗體載入的時候觸發的load事件

namespace delegateprogram

private void eventtest_load(object sender, eventargs e)

}}

現在我們看到當窗體載入的時候就會觸發這個時間。而我們也許不知道怎麼觸發的,現在我們手動讓這個事件觸發,還原c#中事件的一些本質。

public eventtest()

private void myeventtest_load(object sender, eventargs e)

我們可以看到這樣手動新增事件,而不是編譯器的幫助。但是this也是.net為我們封裝的,所以我們沒有看到事件在**執行的**。進一步改進:

public event eventhandler load;

public eventtest()

private void myeventtest_load(object sender, eventargs e)

在上一步的改進中 eventhandler就是乙個委託型別,從中我們可以

看出事件是委託的最終表現形式

,也就是說事件就是委託的一種高階用法,事件就是利用委託實現的

當然我們還可以更徹底的還原,將eventhandler變成我們自己得委託。

//定義自己的**

public delegate void myeventhandler(string msg);

public event myeventhandler load;

public eventtest()

private void myeventtest_load(string msg)

當到這裡對於**和事件的理解也應該更明朗些了吧。事件是**的應用,他們之間也存在一些差異

委託是乙個類,而事件是依賴於類的,所以委託可以宣告在類的外面,而事件必須寫在類的裡面。

事件必須建立在委託的基礎上才能得以實現,即先宣告委託再定義事件。

事件是可連續觸發的,所以對於

事件的賦值要採用「+=」和「-=」運算

,「+=」代表累積事件,「-=」代表移除某一事件。

在不斷學習和工作中感覺會越來越迷茫,唯有將那些一直困惑的東西研究透徹,心中才有恃無恐。一直對委託和事件這個東西想去學習的透徹些,所以每次看了很多別人的文章部落格過後始終似懂非懂的感覺。而這些東西只有自己通過不斷的積累,不斷的豐富閱歷經驗,有一天才會柳暗花明。

c 委託與事件

c 委託與事件 心得 c 用委託來實現事件通知機制。委託相當與c 函式指標。整個過程涉及乙個呼叫者,乙個被呼叫者,還有就是這個委託。實現步驟有以下幾步 1.申明委託,2.定義呼叫者和呼叫的函式,3.定義被呼叫者和具體實現的函式 被呼叫的函式 1.申明委託 在包裡或者類裡,public public ...

C 委託與事件

在c 中,委託類似於c 中的 機制,宣告乙個委託型別,可以分別採用例項方法和靜態方法例項化了委託,所不同的是採用靜態方法例項化的委託,它的 target 屬性為null 而用例項方法例項化的委託,它的 target 屬性為該例項。但是這裡要注意,如果你用 console.writerline del...

C 委託與事件

1.泛型委託 泛型型別 是可適應對多種資料型別執行相同功能的單個程式設計元素。定義泛型類或過程時,無需為可能需要對其執行該功能的每個資料型別定義單獨版本。就好比是帶有可拆卸刀頭的螺絲刀。您檢查需要擰動的螺絲,然後選擇適合該螺絲的刀頭 一字 十字 星形 將正確的刀頭插入到螺絲刀柄上後,您就可以使用螺絲...