C 委託與事件

2022-05-05 22:18:10 字數 2868 閱讀 1671

一、在控制台下使用委託和事件

我們都知道,c#中有「介面」這個概念,所謂的「介面」就是定義一套標準,然後由實現類來具體實現其中的方法,所以說「介面,是一組類的抽象」。同樣道理,我們可以將「委託」理解為「方法的抽象」,也就是說定義乙個方法的模板,至於這個方法具體是怎麼樣的,就由方法自己去實現。

我們知道介面的最大好處就是可以實現多型,同理,「委託」是可以實現方法的多型,當我們想呼叫某個具體方法的時候,我們不直接呼叫這個方法,而是去呼叫這個委託。當然,我們必須在具體方法和委託之間建立某種關聯。

下面我們來看例子。

首先,我們定義乙個委託:

public delegatevoidsaysomething(string name);

這跟抽象方法的語法格式很相似,只是多了乙個關鍵字delegate。既然是對方法的一種抽象,那麼我們最關注的當然就是方法的返回值以及方法的引數了。所以上面紅色的部分就是我們定義出來的乙個規矩,如果某個方法想委託我去做事,那麼請你遵循我的規矩,就是返回值為void,引數為乙個字串。我們這個委託的含義是,當某個人來了,就向他說點東西。

好,既然我們已經定義了這個規矩,下面我們就定義具體的方法了。

publicvoidsayhello(string name)

publicvoidsaynicetomeetyou(string name)

我們這裡一共定義了兩個方法,乙個是向某人說hello,另乙個是向某人說nice to meet you。我們看到,這裡定義的兩個方法的返回值和引數跟我們前面定義的「委託」是一致的。

接下來,我們來看事件。

public eventsaysomethingcome;

我們定義了乙個事件,這個事件是「有人來了」,注意定義的時候我們使用event關鍵字,除此之外,我們還加上了前面定義的「委託」的名字。這個意思是說,我這個事件只會跟「saysomething」打交道,並且,當我這個事件發生的時候,我會通知關注我的這些「委託」(再由這些「委託」去呼叫具體的方法)。

我們來定義乙個測試方法:

public void test()

方法體中的前面兩行是用來例項化委託,注意我們用到了new關鍵字,就好像例項化乙個類一樣,然後傳入乙個引數,但這個引數不是string型別、也不是int型別,而是乙個方法名。

再下面兩行就是將委託加到事件上,意思是說,如果你這個事件發生了,就告訴我一聲。可以通過「+=」來將n個委託例項加到某個事件上,一旦這個事件發生,所有的這些委託例項都會得到通知。

最後一行是觸發乙個事件,注意我們是直接用乙個事件名,然後跟乙個引數,這又跟「委託」中定義的那個規矩一致(即,要有乙個string型別的引數)。

最後執行一下

我們回過頭來再看一下「事件」的定義:

public 

event

saysomethingcome;

這裡已經指出了「委託」的名字,所以,我們可以直接將方法加到事件上,而省略「委託」的例項化過程,因此上面的test()方法可以簡單寫為:

public void test()

二、在窗體中使用委託和事件

上面的例子並不能體現委託和事件的優點,其實,委託和事件在c#中使用非常廣泛,例如,當我們點選某個「按鈕」的時候,就會有乙個「click」事件觸發,而這個事件會通知「委託」,在c#窗體應用程式中,「委託」的名字比較規範,統一使用「eventhandler」,它的具體格式是「void eventhandler(object sender, eventargs e);」。相信大家都寫過下面這樣子的helloworld程式:

當點選按鈕的時候彈出乙個對話方塊。我們怎樣實現的呢?你肯定會說,我們在設計視窗雙擊按鈕,就會自動為我們生成類似如下的方法:

private void button1_click(object sender, eventargs e)

其實,這裡用到的就是事件和委託,這裡的button1_click就是符合eventhandler委託規矩的乙個具體的方法,即返回值為void,引數分別是乙個object和eventargs。

我們可以在form1.designer.cs中看到如下**:

this.button1.click += new system.eventhandler(this.button1_click);

可以看到,這裡有乙個click事件,然後將乙個委託例項附加到這個事件上,跟我們前面講的控制台應用程式中的用法是完全一樣的。那這個click事件是怎麼觸發的呢?對於這些系統類的事件,並不用我們管。

當然,我們也可以定義自己的事件和委託,例如我定義乙個事件,這個事件就是輸出物件的名字。

我們這裡定義了乙個showname委託和乙個btnclick事件。並且,在button1_click()方法中觸發這個btnclick事件。最後的結果是,當我們點選按鈕的時候,首先彈出乙個「我被點選了!!!」的對話方塊,然後確定之後再彈出另乙個顯示按鈕名稱的對話方塊:

c 委託與事件

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

C 委託與事件

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

C 委託與事件

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