我很好奇简单的事件处理程序到底有什么用处。
我可以有以下代码:
event EventHandler blah;
或者
delegate void Blah();
event Blah Blah1;
除了节省一行代码之外,使用事件处理程序有什么优点吗?
我很好奇简单的事件处理程序到底有什么用处。
我可以有以下代码:
event EventHandler blah;
或者
delegate void Blah();
event Blah Blah1;
EventHandler
是一个带有几个额外参数的 delegate
。第一个参数是发送者,也就是引起事件的对象,第二个参数是额外的事件数据。这是一种声明事件非常有用的一致模式。如果不将发送者作为参数传递,你将无法轻松地检测到哪个对象引起了事件,这可能会导致不必要的重复(复制和粘贴)代码。如果遵循标准的事件模式,你的事件处理程序可以根据引起事件的对象的属性执行不同的任务。MouseEventHandler
的事件将在其第二个参数 (MouseEventArgs
) 中传递鼠标指针的位置供你的事件处理程序使用。这种模式的好处是,如果你的事件处理程序是通用的并且不需要它,你可以忽略辅助数据。例如,你可以将具有 EventHandler
签名的方法连接到 MouseEventHandler
事件上(因为第二个参数的类型继承自 EventArgs
)。您的委托不会提供任何有关触发事件的指示 - 没有与“sender”相当的东西。
此外,如果您使用以下签名实现处理程序:
void Handler(object sender, EventArgs e)
Control.KeyPress
事件。Action
的事件(这基本上是您的委托类型对应的内容 - 没有必要声明一个新的)。sender
特别有用。您可以使用发送器获取项目,然后(通常)使用项目上的Tag
获取任何其他信息。 - Marc Gravell