Ela*_*nda 6 c# events event-handling
三个相关的习语:事件,委托,事件处理程序.我总是对谁被"添加"给谁感到困惑.
event += handler
event += delegate
handler += delegate
Run Code Online (Sandbox Code Playgroud)
据我所知:
令我困惑的是MSDN中的这个签名:
public delegate void EventHandler(Object sender, EventArgs e)
Run Code Online (Sandbox Code Playgroud)
该事件添加了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);
Run Code Online (Sandbox Code Playgroud)
“事件”实际上只是与委托一起使用的两种方法的快捷方式 - add 和 remove accessors。默认情况下,编译器在事件背后创建一个委托(如果您不编写自己的访问器)。
当您调用 时someEvent += aDelegate;,您正在调用事件的add访问器。通常,这由编译器转换为delegate +=对具有与事件相同签名的委托的调用 - 类似于自动属性如何自动映射到支持字段。这就是为什么事件看起来与委托如此相似的原因。
更让我困惑的是 MSDN 中的这个签名:public delegate void EventHandler(Object sender, EventArgs e)
这个签名只是一个委托签名。从技术上讲,事件可以使用任何委托。但是,按照惯例,它总是需要两个参数——第一个是引发事件的“发送者”,第二个是派生自EventArgs(如EventHandler和EventHandler<T>)的类。
以下是我的总结(如有错误,请指正):
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;
Run Code Online (Sandbox Code Playgroud)我想推荐这篇很棒的文章:使用 C# 在 .NET 中进行事件处理。
所以我们只能附加(eventName):
eventName += new TypeName (specificMethodName);
Run Code Online (Sandbox Code Playgroud)
这相当于(_eventName 是 delegate\eventHandler):
_eventName += new TypeName (specificMethodName);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5752 次 |
| 最近记录: |