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吗? :) –