委托类型和事件处理程序类型之间的区别是什么?
本文关键字:类型 区别 是什么 之间 程序 事件处理 | 更新日期: 2023-09-27 18:07:57
三个相关的习语:事件,委托,事件处理程序。我总是搞不懂谁是"加"给谁的。
event += handler
event += delegate
handler += delegate
From what I know:
- delegate:一个指向已知签名函数的指针。
- event-handler:一个注册到事件的委托。它和委托一样吗?
- event:使用event()调用事件时执行的委托/事件处理程序列表
更让我困惑的是MSDN中的这个签名:
public delegate void EventHandler(Object sender, EventArgs e)
一个"event"实际上只是两个与委托一起工作的方法的快捷方式——add和remove访问器。默认情况下,编译器会在事件背后创建一个委托(如果你不编写自己的访问器)。
当您调用someEvent += aDelegate;
时,您调用的是事件的add
访问器。通常,这被编译器转换为具有与事件相同签名的委托的delegate +=
调用-类似于自动属性自动映射到支持字段的方式。这就是为什么事件看起来与委托如此相似。
更让我困惑的是MSDN中的签名:public delegate void eventandler (Object sender, EventArgs e)
这个签名只是一个委托签名。从技术上讲,事件可以使用任何委托。然而,按照惯例,它将始终接受两个参数-第一个是引发事件的"发送者",第二个是派生自EventArgs
的类(如EventHandler
和EventHandler<T>
)。
事件添加了一个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);
这是我的总结(如果我错了请纠正我):
-
delegate
是指向方法(instance'static)的指针 -
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;
我想推荐一篇很棒的文章使用c#在。net中处理事件。
所以我们只能附加(eventName):
eventName += new TypeName (specificMethodName);
相当于(_eventName是一个delegate'eventHandler):
_eventName += new TypeName (specificMethodName);