事件是c#中另一高階概念,使用方法和委託相關。奧運會參加百公尺的田徑運動員聽到槍聲,比賽立即進行。其中槍聲是事件,而運動員比賽就是這個事件發生後的動作。不參加該項比賽的人對槍聲沒有反應。
從程式設計師的角度分析,當裁判員槍聲響起,發生了乙個事件,裁判員通知該事件發生,參加比賽的運動員仔細聽槍聲是否發生。運動員是該事件的訂閱者,沒有參賽的人不會注意,即沒有訂閱該事件。
c#中使用事件需要的步驟:
1、建立乙個委託;
2、將建立的委託與特定事件關聯(.net類庫中的很多事件都是已經定製好的,所以他們也就有相應的乙個委託,在編寫關聯c#事件處理程式--也就是當有事件發生時我們要執行的方法的時候我們需要和這個委託有相同的簽名);
3、編寫c#事件處理程式;
4、利用編寫的c#事件處理程式生成乙個委託例項;
5、把這個委託例項新增到產生事件物件的事件列表中去,這個過程又叫訂閱事件。
一、定義事件
定義事件時,發生者首先要定義委託,然後根據委託定義事件。定義事件的語法如下:
《訪問修飾符》 event 委託名 事件名;
定義事件時,一定要有乙個委託型別,用這個委託型別來定義處理事件的方法型別。下面定義乙個發布者類,並在其內部定義eventrun事件。
class judgment
二、訂閱事件
定義好事件後,與事件有關的人會訂閱事件,只有訂閱事件的物件才會收到發生事件的通知,沒有訂閱該事件的物件則不會收到通知。訂閱事件的語法如下:
事件名+=new 委託名(方法名);
假如方法名為run,那麼訂閱事件eventrun的**如下:
judgment.eventrun+=new judgment.delegaterun(runsport.run);
judgment為類judgment的物件,runsport為運動員類runsports的物件,run為其中的方法。
事件的訂閱通過「+=」操作符來實現,可以給事件加乙個或多個方法委託。
三、引發事件
一般都是在滿足某個條件下引發事件,裁判員槍聲一響,引發運動員奔跑這個事件。在程式設計中可以用條件詰句,也可以使用方法引發事件。
public void begin()
這段**中,通過begin方法引發事件enentrun。引發事件的語法與呼叫方法的語法相同,引發該事件時,將呼叫訂閱事件的物件的所有委託。下面**演示裁判員槍聲響起到引發運動員比賽的動作,完整**:
using system;
using system.collections.generic;
using system.linq;
using system.text;
namespace example_eventtest
}class runsports
}class program
}}
judgment類為事件發布者,runsports類為事件訂閱者。引發事件的方法為begin();。乙個事件可以有多個訂閱者,事件的發布者也可以是事件的訂閱者。
一、無引數,無返回的委託事件
委託事件類、事件的發生源。1.宣告委託 2定義事件 3具體方法
public class test
}}
呼叫觸發事件方法(這裡把註冊和呼叫寫在一起,實際可以把註冊寫在另外的類)
class program
static void model_testevent()//事件執行方法,該方法樣式要與委託一致(引數,返回值)
}
補充1、委託鏈。通過+= 新增執行函式。
model.testevent += model_testevent;//為model 註冊testevent事件的執行方法,符合testhandler委託樣式(引數,返回值)的方法都可以進行註冊,可註冊多個函式,按順序執行。如改為
model.testevent += model_testevent1;
+= new test.testhandler(model_testevent1);也可以這樣寫
model.testevent += model_testevent2;
static void model_testevent1()
//可設定斷點看執行順序
static void model_testevent2()
補充2、委託事件 結合在發布訂閱者模式中。
main(string args)方法中我們進行了註冊和呼叫,像觀察者模式使用,就會把註冊和呼叫進行分開。
註冊類,也就是所謂的訂閱類。該類也可以寫成介面,給不同業務的監聽者用來繼承擴張,這裡所有監聽者都執行model_testevent()函式。
public class listeners
//登出
public void nullifyevent(test model)
public virtual void model_testevent()
}
這裡原來是註冊事件,現在改為例項,註冊監聽者。
static void main(string args)
二、帶引數、返回值的委託事件
首先定義事件的引數,這是自定義事件傳入的引數,從eventargs繼承,也可直接用eventargs,這裡為了簡單就只給了個string欄位,利用建構函式賦值。
一般帶返回的委託事件,不會採用+=,因為委託鏈的話,非void,會忽略前面的函式,只會返回最後乙個函式的結果。
public class testeventargs : eventargs
}
委託事件類
public class test
return null;
}}
註冊觸發
static void main(string args)
static string model_testevent(object sender, testeventargs tea)
補充1、
這裡註冊和觸發同樣可以分開,前面的註冊類中把model_testevent改為
public virtual string model_testevent(objectsender,testeventargs tea)//事件執行函式
class program
}
補充2、
事件引數型別也可以封裝,放在test類內(ontestevent改為privte)。在test類內加多
public string initevent(string par)
main就可以改為
static void main(string args)
關於高階事件的使用
1.事件繫結 ie獨有下的繫結事件 attachevent 事件名,函式 反向執行,且乙個按鈕可執行多個事件的功能。detachevent 解除繫結 ff chorme下的繫結事件 addeventlistener removeeventlistener 解除繫結 2.捕獲事件 物件.addeven...
關於C 事件的理解
一 乙個不錯的例子 class filefff public void monitorfile 我們之前已經對委託和事件介紹很多了,現在寫 應該很容易了,現在在這裡直接給出 並在注釋中加以說明 using system using system.collections.generic using s...
關於C 事件的理解
一 乙個不錯的例子 class filefff public void monitorfile 我們之前已經對委託和事件介紹很多了,現在寫 應該很容易了,現在在這裡直接給出 並在注釋中加以說明 using system using system.collections.generic using s...