星期六, 7月 03, 2010

[Asp.Net] 事件與委派詳論

讀了一篇 講得非常白話的 ASP.NET 事件與委派詳論 
也覆習一下事件委派的關係。
記錄一下讀後摘要:



Event 事件 -
例如按下按鈕後執行的Click事件。
在 C# 中事件無法單獨宣告, 而必須和委派一起宣告 。

事件處理函式 (Events Handler) -
事件處理函式就是一個普通的方法 (Method), 可以是 Sub 或是 Function。隨便任何一個方法 (Method) 都可以被當作事件處理函式 (當然, 傳入的參數必須正確)

委派 (Delegate) -
如果以最白話的方式來講, 那麼你可以把這個「委派」想像是事件與事件處理函式中間的一個「跳板」。當一件事情發生時,事件處理函式(EventHander)不見得永遠就是同一個method。

假設一個Click事件,經由委派給方法A,或方法B

this.btn.Click = new EventHandler(btn_AMethodClick);
this.btn.Click = new EventHandler(btn_BMethodClick);

protected void btn_AMethodClick(object sender, EventArgs e)
{
   //dosomething
}

protected void btn_BMethodClick(object sender, EventArgs e)
{
    //dosomething
}

ps:EventHandler為C# 內預設的委派事件處理函式,預設需傳入 object與eventArgs

C#實作(原文範例):
(第一種做法) -


public delegate void myDelegate(int Code);  // 宣告委派

public void ErrorHandler(int Code); // 建立事件處理函式
{
// 在這裡處理事件的因應方法
}

protected void Page_Load(object sender, EventArgs e)
{

 myDelegate someDelegate = new myDelegate(ErrorHandler); // 建立委派的實體 (Instance)

someDelegate(); // 假設有錯誤發生 -> 直接呼叫委派實體

}
(第二種做法) -

public delegate void myDelegate(int Code);

public event myDelegate ErrorFound; // 宣告事件

public void ErrorHandler(int Code);
{
// 在這裡處理事件的因應方法
}

protected void Page_Load(object sender, EventArgs e)
{

ErrorFound = new myDelegate(ErrorHandler); // 透過委派在事件與事件處理函式間建立關聯
ErrorFound(1); // 假設有錯誤發生 -> 發動事件

} 
C# 在事件處理方面和 VB 略有不同。在以上兩個範例中, 結果也是完全相同的。不過, 和 VB 不一樣, 在 C# 中你沒有辦法完全棄委派於不顧, 因為 C# 並不會背地裡幫你把委派偷偷做好, 所以你仍然要自己宣告

沒有留言:

張貼留言

留個話吧:)

其他你感興趣的文章

Related Posts with Thumbnails