熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

.NET中的Event與Delegates

2013-11-13 10:03:34  來源: .NET編程 
今天復習了一下C#中的Delegates與Event Handler整理一下思路如下

使用Delegates進行事件處理一般遵循下面的模式

我們將事件的發起者(Event Source)稱為Publisher將事件的處理者(Event Handler)稱為Subscriber


具體的做法用一個簡單的例子來看如何進行事件的封裝處理!


鲨魚正在網上潛水突然他決定出門(Event)他會有什麼動作呢(Event Handler)?
  > 決定出門了(一個外部調用sharkMindDecideGetOut())
     > 鲨魚的腦子產生一些生物電 (一個事件激發了 OnGetOut)
       > 誰來做處理丟給神經系統吧(一個delegate要負責傳遞指令GetOutEventHandler)
         > 具體如何做當然是鲨魚的身體啦(sharkBodyOpenDoor())
           > 一個事件可能需要好幾個動作處理哦所以我需要開門放下東西關門!


縱觀一下整個事件的處理過程
filename: Programcs

class Program {
static void Main(string[] args) {
//鲨魚的腦袋算是一個事件發起者the Publisher
GetOutPublisher sharkMind = new GetOutPublisher();

//鲨魚的身體算是一個事件處理者the Subscriber
GetOutSubscriber sharkBody = new GetOutSubscriber();

//建立鲨魚的神經系統單元
GetOutEventHandler eventAction = new GetOutEventHandler(sharkBodyOpenTheDoor);
GetOutEventHandler eventAction = new GetOutEventHandler(sharkBodyPutDownWhat);
GetOutEventHandler eventAction = new GetOutEventHandler(sharkBodyCloseTheDoor);

//把鲨魚的神經系統單元與腦子聯系起來 即為將事件處理動作注冊到事件委托中
sharkMindOnGetOutHandler += eventAction;
sharkMindOnGetOutHandler += eventAction;
sharkMindOnGetOutHandler += eventAction;

//外面天氣不錯我決定出去走走於是產生一系列的事件處理!
sharkMindDecideGetOut();
}
}


剖析整個組成先從delegate開始為了能夠封裝事件我們需要先定義一個delegate

  delegate void GetOutEventHandler(Object source GetOutEventArgs e);

假定你的事件處理的時候還需要傳遞一些參數所以我們還需定義一個EventArgs
      就算出門的時候帶什麼東西吧~~~ ^ ^!
filenameGetOutEventArgscs

class GetOutEventArgs : SystemEventArgs {
// 出門帶啥東西呢?
private string _takeWhat;

public GetOutEventArgs() {
this_takeWhat = Nothing;
}

public GetOutEventArgs(string strTakeWhat) {
if (strTakeWhatEquals()) {
this_takeWhat = Nothing;
} else {
this_takeWhat = strTakeWhat;
}
}

public string TakeWhat {
get {
return _takeWhat;
}
set {
_takeWhat = value;
}
}
}


對應出去我們就局限下面的響應動作了
filenameGetOutSubscribecs

  
class GetOutSubscriber {
public void OpenTheDoor(Object source GetOutEventArgs e) {
// 開門
ConsoleWriteLine(Open the door);
}

public void PutDownWhat(Object source GetOutEventArgs e) {
// 放下手中的東西
ConsoleWriteLine(Put down + eTakeWhat + );
}

public void CloseTheDoor(Object source GetOutEventArgs e) {
// 關門
ConsoleWriteLine(Close the door);
}
}


事件是如何產生的
filenameGetOutPublishercs

  
class GetOutPublisher {
//Publisher 說我有一個事件誰來處理?
public event GetOutEventHandler OnGetOutHandler;

//Publisher 產生具體的事件
protected void OnGetOut(GetOutEventArgs e) {
//有誰來負責處理事件嗎?
if (null != thisOnGetOutHandler) {
//讓他們來處理吧
OnGetOutHandler(this e);
}
}

//對外公開的接口調用此方法會產生事件
public void DecideGetOut() {
OnGetOut(new GetOutEventArgs());
}

}


當有了上面的Publisher與Subscriber後要把它們串起來需要遵循下面的過程

   Step 建立Publisher Instance即Event Source
   Step 建立Subscriber Instance即Event Handler
   Step 建立一個Delegate來承接Subscriber的具體動作
   Step 把建立的Delegate與Event進行綁定我們稱之為register
   Step 外部調用產生Event所有的Event Handler收到通知開始執行

   具體可以參考中的主函數的步驟!

運行的結果如下:

Open the door
Put down Nothing
Close the door


From:http://tw.wingwit.com/Article/program/net/201311/12430.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.