2010-01-10 70 views
2

我只是好奇,evenhandler的好处是什么。 我可以有:EventHandler和delegete之间的区别void()

event EventHandler blah; 

delegate void Blah(); 
event Blah Blah1; 

有没有用,除了节约一个额外的代码行事件处理器的一些优势?谢谢。

+0

EventHandler只是一个设计,Microsoft,System.ComponentModel事物(尽管我相信EventHandler委托驻留在System命名空间中)。它的用法是在.NET框架BCL(基类库)中随处可见的模式。 – 2010-01-10 10:21:32

回答

5

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

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

2

你的代表不会给出任何提示事件的迹象 - 没有等同于“发件人”。

此外,如果您实现与签名的处理程序:

void Handler(object sender, EventArgs e) 

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

现在,如果所有活动遵循相同的模式,即一个处理器可以是多个事件中使用的 - 但你不能用它来与委托类型的Action来处理事件(这基本上是你的委托类型对应于 - 不需要声明新的)。

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

+0

对于额外的信息,如果您在运行时使用共享处理程序动态添加控件(例如添加按钮/菜单项),则“sender”特别有用。您可以使用发件人获取项目,然后(通常)在项目上使用“标签”来获取任何额外的信息。 – 2010-01-10 10:16:01

+0

@Jon - 这实际上是让我深陷C#中的东西。你认为代表和事件之间的差异很重要,但尽管我多次阅读了该部分,但我仍在努力争取*为什么*这种差异很重要。我认为你的答案填补了我难题的一部分。 – 2010-01-10 10:19:52

相关问题