[英]C#: EventHandler delegate
public delegate void EventHandler(object sender, EventArgs e);
在上面的代码中,EventHandler是一个委托,它接受object sender, EventArgs e
。 但是,参数的数量在以下实现中不匹配:
this.baptismApplication_add_button.Click += new System.EventHandler(this.baptismApplication_add_button_Click);
我可以看到sender
是this.baptismApplication_add_button_Click
,但方法调用的哪一部分有EventArgs e
? 这是隐含的吗? 或者我这样做是错的?
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
的“构造函数”将一个方法作为参数,所以你不应该在那里传递你的按钮。 你需要一个方法。 我们来写一个:
private void ButtonPressed(object sender, EventArgs e) {
Console.WriteLine("Hello World");
}
现在我们可以使用此方法创建委托:
yourButton.Click += new EventHandler(this.ButtonPressed);
这实际上可以缩短为:
yourButton.Click += ButtonPressed;
现在,每次按下“Hello World”按钮都会打印出来。
您将委托签名和委托构造函数的签名混淆。
委托签名是void (object, EventArgs)
,但委托构造函数(通过new System.EventHandler(...)
调用它)期望上面带有签名的单个方法 ,而不是一对参数。
注意,可以省略显式构造函数调用:
this.baptismApplication_add_button.Click += this.baptismApplication_add_button_Click;
编译器会将其转换为EventHandler
构造函数调用。
+= new System.EventHandler(this.baptismApplication_add_button_Click);
应该
+= new System.EventHandler(myhandler);
其中myhandler
是一个处理程序方法,每个委托定义都有适当的匹配参数
private void myhandler(object sender, EventArgs e)
{
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.