在一个Windows Form应用程序中有一个button,当单击button时会触发Click事件然后执行Click事件处理方法。但是Click事件的本质是什么呢?通常我们写事件的时候,都会将事件的触发放在一个方法中,例如
class MyClass { public event EventHandler MyEvent; // 定义事件 public void Run() // 在某个方法中触发事件 { // 其他代码 MyEvent(); } } class Program { static void Main() { MyClass cl = new MyClass(); cl.MyEvent += cl_MyEvent; // 注册事件 cl.Run(); } private void cl_MyEvent() { //事件处理函数代码 } }
而WinForm是怎么处理的呢?执行这个Click方法的方法又是什么呢?
委托,观察者。等待高人解答....
首先明确几个概念,
1、event是特殊的委托
2、委托是.NET平台下实现回调函数的一种机制
3、回调函数参见:http://zh.wikipedia.org/zh-cn/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0
1、Click的本质是什么呢?
Click本质是一个字段,其类型是EventHandler
2、WinForm是怎么处理的呢?
这叫要说到委托,为当你做一个“+-”的操作的时候你就会把这个方法(cl_MyEvent),还有当前对象(Program) 放在委托链中,什么是委托链。意如其名,委托链的数据结构实际上是一个链表。Click指向链表的开头,每当触发事件的时候就会逐个的调用链表上的节点。每个节点主要包含两个指针,一个指针指方法本身,另一个指针指向与方法关联的对象。实际上在.NET内存空间中,函数代码和实例对象本身就是分开存储的。
3、执行这个Click方法的方法又是什么呢?
请恕在下没看懂这个题目什么意思
我给出的示例代码中,触发MyEvent事件的是一个Run方法,那么同理在单击按钮的时候,也应该有一个方法(至少是一个执行的代码段)触发了这个Click事件,我问的就是这段代码是什么
主要是想用Reflector看一看这段代码学习一下。。。