繁体   English   中英

C#:EventHandler委托

[英]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);

我可以看到senderthis.baptismApplication_add_button_Click ,但方法调用的哪一部分有EventArgs e 这是隐含的吗? 或者我这样做是错的?

delegate是特殊类型。 它们代表方法 这个:

public delegate void EventHandler(object sender, EventArgs e);

并不意味着创建一个EventHandler ,您需要在两个参数传递sendere 它只是意味着

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM