【问题标题】:What is the difference between a delegate type and eventhandler type?委托类型和事件处理程序类型有什么区别?
【发布时间】:2011-09-07 14:30:17
【问题描述】:

三个相关的成语:event、delegate、event-handler。我总是对谁被“添加”到谁感到困惑。

event += handler
event += delegate
handler += delegate

据我所知:

  • 委托:指向具有已知签名的函数的指针。
  • 事件处理程序:注册到事件的委托。基本上和delegate是一样的吗?
  • 事件:使用 event() 调用事件时执行的委托\事件处理程序列表

更让我困惑的是MSDN中的这个签名:

public delegate void EventHandler(Object sender, EventArgs e)

【问题讨论】:

  • 如果我没记错的话,事件“只是”具有多个目标的专门代表。虽然没有方便的 C# 规范来查找它。
  • @Michael:我赞同你的意见。 EventHander 只是一个代表,如 ActionTimerCallback 和许多其他人。区别在于MulticastDelegate 用于将事件分派给许多事件处理委托。

标签: c# events event-handling


【解决方案1】:

“事件”实际上只是使用委托的两种方法的快捷方式 - add and remove accessors。默认情况下,编译器会在事件后面创建一个委托(如果您不编写自己的访问器)。

当您调用 someEvent += aDelegate; 时,您正在调用事件的 add 访问器。通常,编译器会将其转换为delegate += 调用,调用与事件具有相同签名的委托 - 类似于自动属性如何自动映射到支持字段。这就是为什么事件看起来与委托如此相似的原因。

更让我困惑的是 MSDN 中的这个签名: public delegate void EventHandler(Object sender, EventArgs e)

这个签名只是一个委托签名。从技术上讲,事件可以使用任何委托。但是,按照惯例,它总是采用两个参数 - 第一个是引发事件的“发送者”,第二个是派生自 EventArgs 的类(如 EventHandlerEventHandler<T>)。

【讨论】:

    【解决方案2】:

    该事件添加了一个delegate,它“指向”一个处理程序。

    所以基本上,当event 被引发时,它拥有的委托集合将被调用,结果将调用连接到这些委托的处理程序。

    //declare delegate
    public delegate void EventHandler(  Object sender,  EventArgs e)
    
    //create event based on delegate
    public event EventHandler evHandler;
    
    //function to attach to handler
    public static void Handler(object sender, EventArgs e) {}
    
    attach eventhandler function through delegate to event.
    event += new EventHandler(Handler);
    

    【讨论】:

      【解决方案3】:

      这是我的总结(如果我错了,请纠正我):

      • delegate 是指向方法的指针(实例\静态)

      • eventHandler 是具有特定签名(sender、eventArgs)的委托

      • event 是访问任何类型的委托的抽象,但按照惯例它通常是 eventHandler

        //We declare delegates as a new type outside of any class scope (can be also inside?)
        
            public delegate retType TypeName (params...)
        
        //Here we assign
        
            public TypeName concreteDeleagteName = new TypeName (specificMethodName);
        
        //Declaring event
        //a. taken from http://stackoverflow.com/questions/2923952/explicit-event-add-remove-misunderstood
        
        private EventHandler _explicitEvent;
        public event EventHandler ExplicitEvent
        {
           add
           {
               if (_explicitEvent == null) timer.Start();
               _explicitEvent += value;
           }
           remove
           {
              _explicitEvent -= value;
              if (_explicitEvent == null) timer.Stop();
           }
        }
        
        //or: b.auto event - the compiler creates a "hidden" delegate which is bounded to this event
              public event TypeName eventName;
        

      我想推荐这篇很棒的文章Event Handling in .NET Using C#

      所以我们只能附加(eventName):

      eventName += new TypeName (specificMethodName);
      

      相当于(_eventName is a delegate\eventHandler):

      _eventName += new TypeName (specificMethodName);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-02
        • 2010-12-11
        • 1970-01-01
        相关资源
        最近更新 更多