佩服下自己读书的速度,看完事件原理这一部分的内容,我比较乱,接着blog来整理下思路,就从反思.net内置事件入手,我们都知道 当点击 键盘操作 鼠标操作等操作都会映射到相应的事件 最普遍的 button click事件 我们就从这里入手 逐步分析 事件的机制 web开发中 button 继承自 web.control 他有一个 内部的事件 public event EventHandler Click
这是.net标准事件 需要两个参数 就是我们常见的 sender 和 e 这个事件有两个重要的描述 一个是 webcategory action 表示这个事件属于 活动分类,另一个 websysdescription button_onclick 是不是很熟悉 没错这就是事件默认的发起事件的方法名 通过反编译 可以看到 这个事件内部 有自己的 add 和removed 方法 来做注册和解除注册操作
add{base.event.addhandler(event.click,value)} removed{base.event.removeHandler(event.click,value)}通过调用 基类的 event属性的add和removed方法来注册和移除 这里的基类是? 回过头来看 button类 public class button:webControl 明白了 base指的是 webcontrol 那我们来看 webcontrol中 event属性的定义 没有? 再看 上面 webcontrol:control 原来还有一层 再看 擦 都没有 找不到event 我们从addHandler 入手 看看这个方法 究竟在哪 回过头看 啊哈原来是 events 好吧 2了 反编译下 看到 这是一个 control中protected 属性 只限本类和子类访问 实例不能访问 看到这个属性是 eventHandlerList 类型 并且是只读的 我们再来看下 eventHandlerList 这是一个类型 属于 system.componentModel 命名空间 实现了 Idisposed 接口 可以通过 using来 智能回收资源 从字面理解就是 事件委托列表 不深究 回到 刚才 我们看 addhandler 的两个参数 写着 eventclick value 看起来让人容易误解 反编译 可以看到 其实 是 object 和 delegate 其中 value 还是一个 eventHandler eventclick 是一个 button 内部的私人的对象型 字段 只能在button类内部访问 并且是只读的
好了整理下思路,button 的click 事件 被 指定为某钟事件处理程序的过程 button 内部有一个 虚方法 onclick 通过判断eventclcik事件来 形成默认的事件处理程序,addHandler 有一套自我判断委托是否合理的逻辑,技术不够不做深究,button有一个静态的构造方法 来初始化 一个object 对象赋给 eventclick object 而eventclick 是只读的