2011年11月15日 星期二

C#的事件委派

C#的事件用的就是委派來處理的

不像 C++、Delphi 等用的是函式指標來處理事件


發佈文章
例如:Button.Click 事件,定義是 public event EventHandler Click

EventHandler 就是一個委派型別,用來定義事件處理函式的引數數量、引數型別、回傳型別。

定義是:

public delegate void EventHandler (

Object sender,

EventArgs e

)

這表示宣告為 EventHandler 型別的事件,會有兩個引數:sender 與 e,sender 的型別是 Object,而 e 的型別是 EventArgs



事件使用委派來實做與使用函式指標來實做的最大不同,就是指派事件處理函式的寫法不同

以 Delphi 為例,指定一個 Button.OnClick 事件,是這樣寫的:

Button1.OnClick := Button1Click;

而 Button1Click 的宣告是:

procedure TForm1.Button1Click(Sender: TComponent);

begin

  // 按鈕按下要做的事情

end;

一個事件只能「掛上」一個事件處理函式,因為只有一個指標用來紀錄事件處理函式的進入點



而委派的寫法是:

Button1.Click += new EventHandler(Button1Click);

而 Button1Click 的宣告是

public void Button1Click(Object sender, EventArgs e)

{

  // 按鈕按下要做的事情

}

一個事件可以「掛上」多個事件處理函式,只要這樣:

Button1.Click += new EventHandler(Button1Click1);

Button1.Click += new EventHandler(Button1Click2);

Button1.Click += new EventHandler(Button1Click3);

並分別寫好 Button1Click1、Button1Click2、Button1Click3 就可以了



移除事件處理函式的寫法也不同

Delphi 是這樣寫的:

Button1.OnClick := nil;



而 C# 這樣寫:

Button1.Click -= new EventHandler(Button1Click);

為什麼要移除事件處理函式,還要 new EventHandler(Button1Click) 的原因,只是為了比較之用

沒有留言:

張貼留言