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 官方文檔