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) 的原因,只是為了比較之用
沒有留言:
張貼留言