2011-09-07 50 views
6

三个相关的成语:事件,委托,事件处理程序。我总是被谁加“谁”弄糊涂。委托类型和事件处理程序类型有什么区别?

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

据我所知:

  • 委托:一个指向与已知签名的功能。
  • 事件处理程序:注册到事件的委托。基本上,它和代表一样吗?
  • 事件:委托列表\当使用事件()

什么混淆了我更多的是这个签名在MSDN调用事件而被执行的事件处理程序:

public delegate void EventHandler(Object sender, EventArgs e) 
+0

如果我没有记错的话,事件是“只“具有多个目标的专业代表。尽管没有C#规范方便查看它。 –

+0

@迈克尔:我第二你的意见。一个'EventHander'只是一个像Action这样的委托,TimerCallback等等。不同之处在于MulticastDelegate用于向多个事件处理委托派发事件。 – eFloh

回答

-1

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

  • delegate是一个指向方法(例如\静态)

  • eventHandler是与特定的委托签名(发件人,EventArgs)

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

    01通常是一个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为代表\事件处理程序):

_eventName += new TypeName (specificMethodName); 
3

事件有一个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

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

当您拨打someEvent += aDelegate;时,您打电话给事件的add访问者。通常情况下,编译器将其转换为delegate +=调用具有与事件相同签名的委托 - 类似于自动属性自动映射到后台字段的方式。这就是为什么一个事件看起来与代表非常相似的原因。

什么混淆了我更多的是这个签名在MSDN: 公众委托无效事件处理(对象发件人,EventArgs的)

这个签名只是一个委托签名。在技​​术上,事件可以使用任何代表。然而,按照惯例,它总是会有两个参数 - 第一个是发件人提出的事件,第二个是从EventArgs(类似EventHandlerEventHandler<T>)派生的类。

相关问题