C# 知识回顾 - 事件入门
【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/6057301.html
序
之前通过《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》介绍了委托的基本知识,这次我们来看看事件。
目录
- What's 事件
- 事件的属性汇总
- 事件的订阅和取消
- 用 IDE 订阅事件
- 以编程方式订阅事件
- 用匿名方法订阅事件
- 取消订阅
一、What's 事件
类或对象可以通过事件向其他类或对象发出通知。
发行者:触发(引发)事件的类或对象;
订阅者:接收(或处理)事件的类或对象。
在过去的开发中,经典的 WinForm 和 WebForm 是都通过事件驱动来体现他们的强大之处。通过 IDE,轻松订阅按钮和一些输入控件引发的事件,自动在类的空白处为我们添加事件处理程序的方法和订阅该事件的代码
二、事件的属性汇总
- 发行者确定何时引发事件;订阅者决定如何对事件作出响应。
- 一个事件可以被多个类或对象进行订阅,订阅者可以自由地选择合适的方式进行处理。
- 没有订阅者进行订阅的事件永远也不会被触发
- WinForm 和 WebForm 中的事件通常用来表示用户执行的某项操作。
- 当一个事件包含多个订阅者时,在触发该事件的同时会默认以同步的形式调用事件处理程序。
- 事件基于 EventHandler 委托和 EventArgs 基类。
三、事件的订阅和取消
1.用 IDE 订阅事件

图3-1-1 新建一个 WinForm 项目
图3-1-2 由图1双击时所自动创建的代码
图3-1-3 除了图2,在 InitializeComponent 方法也自动增加了这行代码
2.以编程方式订阅事件
假设现在是一个新的 WinForm 程序,我们通过手动的方式自己创建事件。在 InitializeComponent 方法下面输入 this.Load +=,然后会出现提示,这时我们按下“Tab 键”,
图3-2-1
会发现也会自动创建事件处理程序,效果跟上一节的直接双击空白处创建的代码可以说是一致的,代码如下:
1 public partial class Form1 : Form
2 {
3 public Form1()
4 {
5 InitializeComponent();
6
7 this.Load += Form1_Load;
8 }
9
10 private void Form1_Load(object sender, EventArgs e)
11 {
12 throw new NotImplementedException();
13 }
14 }
这次,我们直接采用 lambda 方式完成事件的注册:点击空白处显示鼠标点击时的坐标。
1 public partial class Form1 : Form
2 {
3 public Form1()
4 {
5 InitializeComponent();
6
7 //this.Load += Form1_Load;
8
9 //点击事件(lambda 方式创建)
10 this.Click += (s, e) =>
11 {
12 MessageBox.Show($"{((MouseEventArgs)e).Location}");
13 };
14 }
15
16 private void Form1_Load(object sender, EventArgs e)
17 {
18 throw new NotImplementedException();
19 }
20 }
【备注】内容涉及
$
: (C# 6) 的语法,vs2015 以上才支持。$"{msg}" 相当于 string.Format("{0}", msg), msg 指变量。
图3-2-2
3.用匿名方法订阅事件
1 public Form1()
2 {
3 InitializeComponent();
4
5 //this.Load += Form1_Load;
6
7 //点击事件(lambda 方式创建)
8 //this.Click += (s, e) =>
9 //{
10 // MessageBox.Show($"{((MouseEventArgs)e).Location}");
11 //};
12
13 //使用匿名方法创建事件
14 this.Click += delegate (object sender, EventArgs e)
15 {
16 var mouseEventArgs = (MouseEventArgs)e;
17 var mouseLocation = mouseEventArgs.Location;
18
19 MessageBox.Show($"X: {mouseLocation.X}, Y: {mouseLocation.Y}");
20 };
21 }
【注意】建议不要使用匿名函数来订阅事件,因为这样会间接的增加取消订阅时的难度。除非你确定自己不会取消订阅。
4.取消订阅
你可以选择取消订阅事件,来防止触发对应的事件处理程序。你可以使用 -= 进行取消事件的订阅。
this.Load -= Form1_Load; //使用减法赋值运算符 (-=) 取消订阅事件
传送门
《C# 知识回顾 - 序列化》
《C# 知识回顾 - 表达式树 Expression Trees》
《C# 知识回顾 - 特性 Attribute》、《剖析 AssemblyInfo.cs - 了解常用的特性 Attribute》
《C# 知识回顾 - 委托 delegate》、《C# 知识回顾 - 委托 delegate (续)》
【参考】https://msdn.microsoft.com/zh-cn/library/awbftdfh(VS.80).aspx
【参考】微软 MSDN 官方文档