EventHandler和委托void()之间的区别

时间:2010-01-10 10:08:50

标签: c# events

我很好奇究竟什么是简单的事件处理程序。 我可以:

event EventHandler blah;

delegate void Blah();
event Blah Blah1;

除了节省额外的代码行之外,使用事件处理程序是否有一些优势?

2 个答案:

答案 0 :(得分:5)

EventHandlerdelegate,有一些额外的参数。第一个是发件人,即导致该事件的对象,第二个是额外的事件数据。它只是一个用于声明事件的一致模式。如果不将发送方作为参数传递,则无法轻松检测到哪个对象导致它,这可能会导致不必要的重复(复制和粘贴)代码。如果您遵循标准事件模式,则事件处理程序可以根据导致事件的对象的属性执行不同的任务。

此外,某些事件会沿着它们传递额外信息,例如,键入的事件MouseEventHandler将在其第二个参数(MouseEventArgs)中传递鼠标指针的位置,供您的事件处理程序使用。这种模式的好处是,如果事件处理程序是通用的并且不需要它,则可以忽略辅助数据。例如,您可以将具有EventHandler签名的方法连接到MouseEventHandler事件(因为第二个参数的类型继承自EventArgs)。

答案 1 :(得分:2)

你的代表不会说明引发事件的原因 - 没有相当于“发件人”。

此外,如果您实现签名为:

的处理程序
void Handler(object sender, EventArgs e)

然后,由于委托方差,可以处理正常模式之后的任何事件。因此,即使您不需要来自事件参数的任何信息,您仍然可以订阅(比方说)Control.KeyPress事件。

现在,如果所有事件都遵循相同的模式,那么一个处理程序可用于多个事件 - 但您无法使用它来处理委托类型为{{1}的事件}(这基本上是你的委托类型对应的 - 没有必要声明一个新的)。

编辑:鉴于你的评论,我觉得我应该指出你的问题并没有真正涵盖事件和代表之间的差异 - 它涵盖了为事件使用“标准”代表类型和使用“自定义”之间的区别“事件的委托类型。委托和事件之间的区别实际上是关于封装。我有一个你可能会觉得有用的article - 尽管它与深度中的C#大致相同。