C# 知識回顧 - 事件入門
【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/6057301.html
序
之前通過《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)》介紹了委托的基本知識,這次我們來看看事件。
目錄
一、What's 事件
類或對象可以通過事件向其他類或對象發出通知。
發行者:觸發(引發)事件的類或對象;
訂閱者:接收(或處理)事件的類或對象。
在過去的開發中,經典的 WinForm 和 WebForm 是都通過事件驅動來體現他們的強大之處。通過 IDE,輕松訂閱按鈕和一些輸入控件引發的事件,自動在類的空白處為我們添加事件處理程序的方法和訂閱該事件的代碼
二、事件的屬性匯總
-
發行者確定何時引發事件;訂閱者決定如何對事件作出響應。
-
一個事件可以被多個類或對象進行訂閱,訂閱者可以自由地選擇合適的方式進行處理。
-
沒有訂閱者進行訂閱的事件永遠也不會被觸發
-
WinForm 和 WebForm 中的事件通常用來表示用戶執行的某項操作。
-
當一個事件包含多個訂閱者時,在觸發該事件的同時會默認以同步的形式調用事件處理程序。
-
事件基於 EventHandler 委托和 EventArgs 基類。
三、事件的訂閱和取消
圖3-1-1 新建一個 WinForm 項目
圖3-1-2 由圖1雙擊時所自動創建的代碼
圖3-1-3 除了圖2,在 InitializeComponent 方法也自動增加了這行代碼
假設現在是一個新的 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
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 }
【注意】建議不要使用匿名函數來訂閱事件,因為這樣會間接的增加取消訂閱時的難度。除非你確定自己不會取消訂閱。
你可以選擇取消訂閱事件,來防止觸發對應的事件處理程序。你可以使用 -= 進行取消事件的訂閱。
this.Load -= Form1_Load; //使用減法賦值運算符 (-=) 取消訂閱事件
傳送門
《C# 知識回顧 - 委托 delegate》、《C# 知識回顧 - 委托 delegate (續)》
【參考】https://msdn.microsoft.com/zh-cn/library/awbftdfh(VS.80).aspx
【參考】微軟 MSDN 官方文檔