引言:

当我们在点击窗口中的Button控件VS会帮我们自动生成一些代码,我们只需要在Click方法中写一些自己的代码就可以实现触发Click事件后我们Click方法中代码就会执行,然而我一直有一个疑问的——既然上一专题中说事件是一个多播委托,然而自动生成的代码中只有事件的实例化,却没有看到事件的调用,那既然没有事件调用的代码,那封装的Click为什么会执行呢?

一、点击按钮时触发Click事件背后发送的事情

在引言中提出了我的提问的, 我相信有些朋友可能也会有这样的疑问的,然后事件肯定是调用了的, 只是不是我们代码中调用,而是Butoon控件的内部代码里面调用了事件,而导致委托封装的Click方法而被调用,这样才符合我们看到的情况的——我们点击按钮后,我们后台代码中的Click方法就会执行。为了明白到底背后发生了什么事情的, 让我们一起来探究个究竟吧?

我们新建一个Windows 窗体程序,然后在窗体中拖入一个Button控件并单击按钮,这时候VS为我们生成了如下的代码:

 private System.Windows.Forms.Button button1;private void InitializeComponent(){his.button1 = new System.Windows.Forms.Button();this.button1.Location = new System.Drawing.Point(105, 89);this.button1.Name = "button1";this.button1.Size = new System.Drawing.Size(75, 23);this.button1.TabIndex = 0;this.button1.Text = "请点击我";this.button1.UseVisualStyleBackColor = true;this.button1.Click += new System.EventHandler(this.button1_Click);
}
// 后台代码private void button1_Click(object sender, EventArgs e){}

从上面代码中我们看到VS为我们自动创建了一个Button对象并实例化,设置了它的属性并通过 this.button1.Click += new System.EventHandler(this.button1_Click);这行代码把 button1_Click注册对Click事件的关注,然而事件的调用代码在哪里呢? 下面我们就在button1_Click方法里面设置断点看看代码是如何执行的(通过查看调用堆栈来看看代码的执行顺序),下面是我设置断点的一张调用堆栈截图:

从上图中我发现在调用button1_Click方法之前要执行Control.OnClick(System.EventArgs e)方法的,然后我们用发射工具去查看下Control.OnClick(System.Eventrgs e)方法中具体有什么样的代码:OnClick方法内部代码截图为:

从反射的代码中可以明白,首先从Events(大家可以通过反射工具去查看Events的类型,它的类型为EventHandlerList,而EventHandlerList又是一个密封类)委托集合中取出委托,如果Click事件(委托)实例化了的话,此时就不为空,此时就会调用委托——handler(this, e),我们知道之前我们通过 this.button1.Click += new System.EventHandler(this.button1_Click);代码实例化了委托事件,所以此时被EventHandler封装的button1_Click方法就会执行。

通过上面的解释我已经解除了我一开始的疑惑了,事件的调用在.Net类库中的Control.OnClick方法里面调用,这也就是我说要表达的Click事件背后做的事情的
下面是反射得到的Click事件的代码截图:

二、小结

本专题首先提出我对按钮单击事件背后发生的事情的疑惑,通过调试和反射工具一步一步把疑惑接触,相信其他控件的其他事件也是如此的,本专题主要想让大家知道下.Net类库为我们做的事情的,希望一些初学者们了解知识时,要努力知道事物的本质。最后希望本专题可以让大家更进一步的理解事件的本质的,我将下一专题和大家分享下我理解的泛型到底是怎样的。

反射工具的下载地址:http://files.cnblogs.com/zhili/Reflector.zip

转载于:https://www.cnblogs.com/zhili/archive/2012/10/29/ButtonClickEvent.html

[C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情相关推荐

  1. [C#基础知识系列]专题十七:深入理解动态类型

    本专题概要: 动态类型介绍 为什么需要动态类型 动态类型的使用 动态类型背后的故事 动态类型的约束 实现动态行为 总结 引言: 终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善--Com 互 ...

  2. [C#基础知识系列]专题十二:迭代器

    引言: 在C# 1.0中我们经常使用foreach来遍历一个集合中的元素,然而一个类型要能够使用foreach关键字来对其进行遍历必须实现IEnumerable或IEnumerable<T> ...

  3. [C# 基础知识系列]专题十四:深入理解Lambda表达式

    引言: 对于刚刚接触Lambda表达式的朋友们,可能会对Lambda表达式感到非常疑惑,它到底是个什么什么样的技术呢?以及它有什么好处和先进的地方呢?下面的介绍将会解除你这些疑惑. 一.Lambda表 ...

  4. 【转】[C# 基础知识系列]专题四:事件揭秘

    引言: 前面几个专题对委托进行了详细的介绍的,然后我们在编写代码过程中经常会听到"事件"这个概念的,尤其是写UI的时候,当我们点击一个按钮后VS就会自动帮我们生成一些后台的代码,然 ...

  5. [C# 基础知识系列]专题十五:全面解析扩展方法

    引言:  C# 3中所有特性的提出都是更好地为Linq服务的, 充分理解这些基础特性后.对于更深层次地去理解Linq的架构方面会更加简单,从而就可以自己去实现一个简单的ORM框架的,对于Linq的学习 ...

  6. [C#基础知识系列]专题十:全面解析可空类型

    引言: C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容(最近一直都在思考如何来分享这篇文章的,因为刚 ...

  7. [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型

    引言: 前面专题主要介绍了C#1中的2个核心特性--委托和事件,然而在C# 2.0中又引入一个很重要的特性,它就是泛型,大家在平常的操作中肯定会经常碰到并使用它,如果你对于它的一些相关特性还不是很了解 ...

  8. 链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链

    最近研究链方法,稍微总结一下,以后继续补充: 弁言: 上一专题分析了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的分析都是委托只是封装一个方法,那委 ...

  9. [C#基础知识系列]专题十:全面解析可空类型[转]

    原文链接 主要内容: 1:空合并操作符(?? 操作符) ??操作符也就是"空合并操作符",它代表的意思是两个操作数,如果左边的数不为null时,就返回左边的数,如果左边的数为nul ...

最新文章

  1. 乐高机器人教室布置图片大全_全国青少年机器人技术等级考试(上海宝山站)顺利举行...
  2. apache配置虚拟主机(virtual host) 笔记
  3. $.post把表单对象传递过去_第二章 第三节 Request请求对象详解
  4. 【object-c基础】Object-c基础之三:面对对象开发@interface,@implementation
  5. JavaScript中的Math方法演示
  6. 通过建站学运维1901-08任务
  7. 集成产品开发团队的管理和决策
  8. 【数据结构笔记29】最小生成树问题:Prim算法与Kruskal算法
  9. 前端后台学习笔记汇杂
  10. ListView+CheckBox两种解决方式及原因分析
  11. 微软为“离线”做好准备:推出同步框架
  12. 浙工商电信闪讯老毛子路由器设置
  13. 实现B站弹幕很难么?这个开源项目了解一下
  14. java win7 管理员权限_Win7系统如何一键取得管理员权限
  15. android studio拨打电话代码,AndroidStudio实现拨打电话和发短信(kotlin)
  16. 新手如何使用腾讯云云服务器详细教程
  17. torch实现ESIM算法
  18. 筛法(线性筛,厄拉多塞筛)
  19. 微信公众号html标签,微信公众号用户标签管理
  20. 网络安全实验室---解密关

热门文章

  1. 代码组织和部署 文件操作 node.js
  2. RSA非对称加密简析-java
  3. javaScript中的几种排序方式
  4. 印章WinForm自定义控件封装,提供源码下载
  5. 在线音乐电台Pandora股价暴涨20% CEO肯尼迪辞任
  6. ADO.NET知识学习总结
  7. left join 和 left outer join 有什么区别
  8. 调度器的精髓--优先级下兼顾公平
  9. VSTS Code Analysis 错误 CA1014 CLSCompliantAttribute 及Suppress Message (镇压Code Ananlysis)...
  10. 程序员委托事件学习随笔