程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 再談C#委托與事件

再談C#委托與事件

編輯:C#入門知識

之前寫過一篇關於C#委托與事件的文章(見《C#委托和事件例析》),不過還是收到一些網友的提問。所以,今天再換另一個角度來詳解一下這個問題。

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

我們都知道,C#中有“接口”這個概念,所謂的“接口”就是定義一套標准,然後由實現類來具體實現其中的方法,所以說“接口,是一組類的抽象”。同樣道理,我們可以將“委托”理解為“方法的抽象”,也就是說定義一個方法的模板,至於這個方法具體是怎麼樣的,就由方法自己去實現。

我們知道接口的最大好處就是可以實現多態,同理,“委托”是可以實現方法的多態,當我們想調用某個具體方法的時候,我們不直接調用這個方法,而是去調用這個委托。當然,我們必須在具體方法和委托之間建立某種關聯。

下面我們來看例子。

首先,我們定義一個委托:

   SaySomething( name);

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

  SayHello( + name +   SayNiceToMeetYou( + name + 

接下來,我們來看事件。

public   come;

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

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

 = = +=+=

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

最後一行是觸發一個事件,注意我們是直接用一個事件名,然後跟一個參數,這又跟“委托”中定義的那個規矩一致(即,要有一個string類型的參數)。

最後運行一下

  Main(= 

再談C委托與事件 - 瑞志.net - 山林客

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

public   come;

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

 +=+=

上面的例子並不能體現委托和事件的優點,其實,委托和事件在C#中使用非常廣泛,例如,當我們點擊某個“按鈕”的時候,就會有一個“Click”事件觸發,而這個事件會通知“委托”,在C#窗體應用程序中,“委托”的名字比較規范,統一使用“EventHandler”,它的具體格式是“void EventHandler(object sender, EventArgs e);”。相信大家都寫過下面這樣子的HelloWorld程序:

再談C委托與事件 - 瑞志.net - 山林客

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

  button1_Click(

我們可以在Form1.Designer.cs中看到如下代碼:

this.button1.Click += new System.EventHandler(this.button1_Click);

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

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

再談C委托與事件 - 瑞志.net - 山林客

我們這裡定義了一個ShowName委托和一個btnclick事件。並且,在button1_Click()方法中觸發這個btnclick事件。最後的結果是,當我們點擊按鈕的時候,首先彈出一個“我被點擊了!!!”的對話框,然後確定之後再彈出另一個顯示按鈕名稱的對話框:

再談C委托與事件 - 瑞志.net - 山林客

 

轉載自:http://ruizhinet.blog.163.com/blog/static/9921382820092801032681/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved