public delegate void EventHandler(object sender, EventArgs e);
public class Button: Control
{
public event EventHandler Click;
protected void OnClick(EventArgs e) {
if (Click != null) Click(this, e);
}
}
本书通过以下方式解释了上述代码:
Button类中的OnClick方法“引发”Click事件。提出事件的概念恰恰等同于引用事件 由事件代表的代表 - 因此,没有特别的 用于举起活动的语言结构。请注意代表 调用之前是一个确保委托是的检查 非空。
为什么在每个事件处理程序都有一个委托实例时,事件中只有一个委托?实例是一个实例,事件可以包含许多连接到实际方法的委托实例。
如果有人能为我理解这一段,我将不胜感激。
答案 0 :(得分:0)
This is in depth可能并不完全符合您的要求。但是,它以非常好的细节打破了事件和代表之间的差异......一直到IL。
答案 1 :(得分:0)
现在“事件所代表的代表”是什么意思?
这是事件从提升它的代码的角度看起来像的方式。事件是使用标准方法调用语法(而不是某些“特殊”语法)引发的,而后者又调用所有已订阅的事件处理程序in no particular order。
“确保委托是非空的检查”是什么意思?
如果没有事件处理程序订阅该事件,则“表示事件的委托”为空。所以为了举起这个活动,你应该这样做:
class MyClass {
public delegate void MyEventHandler(MyEventArg arg);
public event MyEventHandler MyEvent;
void RaiseMyEvent(MyEventArg arg) {
var handler = MyEvent;
if (handler != null) // Any subscribers?
handler(arg);
}
}
顺便说一句,将事件复制到局部变量(handler
)被认为是this reason的一个好习惯。