我很好奇究竟什么是简单的事件处理程序。 我可以:
event EventHandler blah;
或
delegate void Blah();
event Blah Blah1;
除了节省额外的代码行之外,使用事件处理程序是否有一些优势?
答案 0 :(得分:5)
EventHandler
是delegate
,有一些额外的参数。第一个是发件人,即导致该事件的对象,第二个是额外的事件数据。它只是一个用于声明事件的一致模式。如果不将发送方作为参数传递,则无法轻松检测到哪个对象导致它,这可能会导致不必要的重复(复制和粘贴)代码。如果您遵循标准事件模式,则事件处理程序可以根据导致事件的对象的属性执行不同的任务。
此外,某些事件会沿着它们传递额外信息,例如,键入的事件MouseEventHandler
将在其第二个参数(MouseEventArgs
)中传递鼠标指针的位置,供您的事件处理程序使用。这种模式的好处是,如果事件处理程序是通用的并且不需要它,则可以忽略辅助数据。例如,您可以将具有EventHandler
签名的方法连接到MouseEventHandler
事件(因为第二个参数的类型继承自EventArgs
)。
答案 1 :(得分:2)
你的代表不会说明引发事件的原因 - 没有相当于“发件人”。
此外,如果您实现签名为:
的处理程序void Handler(object sender, EventArgs e)
然后,由于委托方差,可以处理正常模式之后的任何事件。因此,即使您不需要来自事件参数的任何信息,您仍然可以订阅(比方说)Control.KeyPress
事件。
现在,如果所有事件都遵循相同的模式,那么一个处理程序可用于多个事件 - 但您无法使用它来处理委托类型为{{1}的事件}(这基本上是你的委托类型对应的 - 没有必要声明一个新的)。
编辑:鉴于你的评论,我觉得我应该指出你的问题并没有真正涵盖事件和代表之间的差异 - 它涵盖了为事件使用“标准”代表类型和使用“自定义”之间的区别“事件的委托类型。委托和事件之间的区别实际上是关于封装。我有一个你可能会觉得有用的article - 尽管它与深度中的C#大致相同。