2014年5月21日 星期三

[筆記] ASP.NET 事件與委派詳論

最近會用到VB .NET的事件,但其實對這東西不大了解,中午吃飯的時候問強者同事陳,他丟了個網頁給我要我研究一下(這好像是一件蠻有趣的事,要是在寫程式的時候遇到不懂得去問人,得到比較奛的答案常常都是一篇寫得不錯的文章,反倒很少有人直接跟你說答案,也許是因為答案都不簡單吧@@~總之要走programing的話閱讀能力真的很重要!)
這篇文章出處是Johnny.NetASP.NET 2Share @ 點部落的[入門文章] ASP.NET 事件與委派詳論
筆記開始

使用時機: 寫使用者控制項或自訂控制項

事件(Event):
VB: Public Event ErrorFound(ErrorCode As Integer)
C#的事件不能單獨宣告,而須與委派一起宣告

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

委派 (Delegate)
決定應該由哪個Event Handler來處理Event

講白了, delegate 它還真不是什麼東西, 它是單純的一種「語法」, 只是一個關鍵字, 它能讓編譯器把跟在它後面的東西解釋成一個繼承 MulticastDelegate 的類別。以下面這行程式為例:

 Event (VB) 和 event (C#) 雖然看起來它使用於「宣告」, 它卻並不是什麼類別; 它純粹只是個關鍵字, 用來告訴編譯程式這個字後面跟著一個將被用做「Event 物件」的一個 myDelete 的 instance 而已。

C#中若不想自己定義委派的類別可以使用EventHandler,如以下範例
ddl.SelectedIndexChanged += new EventHandler(selectedIndexChanged); // 必須選擇在某個方法內宣告 (例如 Page_Load)
EventHandler 本身是一個系統所提供的預設委派型別之一,這個委派的參數型式是固定的。你一定只能採用 (object sender, EventArgs e)

範例一
[VB]
Public Delegate Sub myDelegate(ByVal Code As Integer) ' 宣告委派
Dim SomeDelegate As New myDelegate(AddressOf ErrorHandler) ' 建立委派的實體 (Instance)
Public Sub ErrorHandler(ByVal Code As Integer) ' 建立事件處理函式
    ' 在這裡處理事件的因應方法
End Sub
Sub Page_Load(...) Handles Me.Load
SomeDelegate(1) ' 當有錯誤發生時直接呼叫委派實體
End Sub
[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(5); // 當有錯誤發生時直接呼叫委派實體
}
範例二
[VB]
Public Event ErrorFound(ErrorCode As Integer) ' 宣告事件
Public Sub ErrorHandler(ByVal Code As Integer)
    ' 在這裡處理事件的因應方法
End Sub
Sub Page_Load(...) Handles Me.Load
    AddHandler Me.ErrorFound, AddressOf ErrorHandler ' 將事件和事件處理函式之間建立關聯
    RaiseEvent ErrorFound(1) ' 當有錯誤發生時發動事件
End Sub

[C#]
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); // 當有錯誤發生時發動事件
}

沒有留言:

張貼留言