C#:事件处理程序委托(delegate)

标签 c# events delegates event-handling

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

在上面的代码中,EventHandler 是一个接受对象发送者 EventArgs e 的委托(delegate)。但是,以下实现中的参数数量不匹配:

this.baptismApplication_add_button.Click += new System.EventHandler(this.baptismApplication_add_button_Click);

我可以看到 senderthis.baptismApplication_add_button_Click,但是方法调用的哪一部分有 EventArgs e ?是隐含的吗?还是我的做法完全错了?

最佳答案

delegate 是特殊类型。它们委托(delegate)方法。这:

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

意味着要创建EventHandler,您需要传入两个参数sendere 。简单来说就是

EventHandler represents a method with the signature of (object sender, EventArgs e) returning void.

要创建EventHandler,您需要传入具有所需签名的方法。例如这个方法:

private void MyMethod(object sender, EventArgs e) {

}

您可以像这样创建一个EventHandler:

new EventHandler(MyMethod);

注意我在方法名称后面没有写 () 。这样做会调用该方法。我们不希望这样。在这里我们只想引用它。

让我们看另一个例子。

public delegate void Action();

要创建操作,您需要一个没有参数并返回void的方法。像这样:

private void MyMethod2() {}
// ...
new Action(MyMethod2);

现在您已经了解了委托(delegate)的工作原理,我们可以讨论如何正确订阅 Click 事件。

正如我所说,EventHandler 的“构造函数”采用方法作为参数,因此您不应该在其中传递按钮。你需要一个方法。让我们写一个:

private void ButtonPressed(object sender, EventArgs e) {
    Console.WriteLine("Hello World");
}

现在我们可以使用此方法创建委托(delegate):

yourButton.Click += new EventHandler(this.ButtonPressed);

这实际上可以缩短为:

yourButton.Click += ButtonPressed;

现在每次按下按钮时都会打印“Hello World”。

关于C#:事件处理程序委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45730707/

相关文章:

C# Windows 服务启动速度不够快

javascript - DOM 级别 3 规范的事件组章节发生了什么?

reactjs - React Typescript 中的类型 'elements' 上不存在属性 'EventTarget'

objective-c - 如何继承 UIScrollView 并将委托(delegate)属性设为私有(private)

c# - WPF UI 仅在调试时崩溃

javascript - 使用 axios 从 vue 上传 XML 文件到 asp .net core

c# - 尝试生成 xsd :schema using xsd. exe 时出错

Azure 自动化清除 CDN 端点

ios - 最好的委托(delegate)或获得监督是什么?

ios - 框架中的 Swift 协议(protocol)