【问题标题】:Difference between EventHandler and delegate void()EventHandler 和委托 void() 的区别
【发布时间】:2018-12-16 00:25:34
【问题描述】:

我只是好奇简单的 evenhandler 到底有什么好处。 我可以:

event EventHandler blah;

delegate void Blah();
event Blah Blah1;

除了节省额外的代码行之外,使用 EventHandlers 有什么好处吗?

【问题讨论】:

  • EventHandler 只是一个设计,一个 Microsoft System.ComponentModel 的东西(尽管我相信 EventHandler 委托驻留在 System 命名空间中)。它的用法是在 .NET 框架 BCL(基类库)中随处可见的模式。

标签: c# events


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您的代表不会给出任何引发事件的指示 - 没有等同于“发送者”。

    另外,如果你实现一个带有以下签名的处理程序:

    void Handler(object sender, EventArgs e)
    

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

    现在,如果 所有 事件遵循相同的模式,则一个处理程序可能可用于多个事件 - 但您不能使用它来处理委托类型为 Action 的事件(这基本上是您的委托类型对应的 - 无需声明新的)。

    编辑:鉴于您的评论,我觉得我应该指出,您的问题并没有真正涵盖事件和委托之间的区别 - 它涵盖了对事件使用“标准”委托类型和使用“自定义”之间的区别" 事件的委托类型。委托和事件之间的区别实际上在于封装。我有一个article,您可能会觉得它很有用——尽管它在深度上与 C# 基本相同。

    【讨论】:

    • 有关更多信息,如果您在运行时使用共享处理程序动态添加控件,sender 特别有用 - 例如,添加按钮/菜单项。您可以使用发件人获取项目,然后(通常)使用项目上的Tag 获取任何额外信息。
    • @Jon - 这实际上是让我在 C# 中深度学习的东西。您指出代表和事件之间的区别很重要,但尽管多次阅读该部分,但我仍为 为什么 区别很重要而苦苦挣扎。我认为您在这里的回答为我解决了部分难题。
    猜你喜欢
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2011-10-12
    • 2011-01-14
    相关资源
    最近更新 更多