delegate
是特殊類型。它們代表方法。這:
public delegate void EventHandler(object sender, EventArgs e);
不不意味着創建一個EventHandler
,你需要兩個參數sender
和e
通過。它只是意味着
EventHandler
表示與(object sender, EventArgs e)
簽名返回void
的方法。
要創建EventHandler
,您需要傳入具有所需簽名的方法。例如,這種方法:
private void MyMethod(object sender, EventArgs e) {
}
您可以創建一個EventHandler
這樣的:
new EventHandler(MyMethod);
注意如何我的方法名稱後沒寫()
。這樣做會調用該方法。我們不希望這樣。在這裏,我們只是想參考它。
我們來看另一個例子。
public delegate void Action();
要創建Action
,你需要沒有參數和返回void
的方法。就像這樣:
private void MyMethod2() {}
// ...
new Action(MyMethod2);
現在,你明白的代表是如何工作的,我們可以談談如何正確訂閱Click
事件。
正如我所說,EventHandler
的「構造函數」採用一種方法作爲參數,所以你不應該在那裏傳遞你的按鈕。你需要一種方法。讓我們寫一個:
yourButton.Click += new EventHandler(this.ButtonPressed);
這實際上可以簡化爲::
yourButton.Click += ButtonPressed;
現在每次你按下按鈕「
private void ButtonPressed(object sender, EventArgs e) {
Console.WriteLine("Hello World");
}
現在,我們可以用這個方法來創建委託Hello World「將被打印。
發送者和EventArgs作爲參數傳入哪個部分?我似乎無法在我的代碼中找到它 –
@DonovanKeating哈哈,好問題。 'ButtonPress'的實際調用不是由你完成的。它由按鈕的代碼完成。你只需要給按鈕打電話的方法。這就是爲什麼它被稱爲「代表」。你只需要給它一個具有正確簽名的方法。 – Sweeper
所以我真的不能看到它因爲它是「隱藏」?如果我創建自己的EventHandler,那麼我必須指定sender和EventArgs嗎? :) –