結(jié)合Visual C#開發(fā)環(huán)境講解C#中事件的訂閱和取消訂閱
類或?qū)ο罂梢酝ㄟ^事件向其他類或?qū)ο笸ㄖl(fā)生的相關(guān)事情。發(fā)送(或引發(fā))事件的類稱為“發(fā)行者”,接收(或處理)事件的類稱為“訂戶”。
在典型的 C# Windows 窗體或 Web 應(yīng)用程序中,可訂閱由控件(如按鈕和列表框)引發(fā)的事件??墒褂?Visual C# 集成開發(fā)環(huán)境 (IDE) 來瀏覽控件發(fā)布的事件,選擇要處理的事件。IDE 會(huì)自動(dòng)添加空事件處理程序方法和訂閱事件的代碼。
事件概述
事件具有以下特點(diǎn):
- 發(fā)行者確定何時(shí)引發(fā)事件,訂戶確定執(zhí)行何種操作來響應(yīng)該事件。
- 一個(gè)事件可以有多個(gè)訂戶。一個(gè)訂戶可處理來自多個(gè)發(fā)行者的多個(gè)事件。
- 沒有訂戶的事件永遠(yuǎn)也不會(huì)引發(fā)。
- 事件通常用于通知用戶操作,例如,圖形用戶界面中的按鈕單擊或菜單選擇操作。
- 如果一個(gè)事件有多個(gè)訂戶,當(dāng)引發(fā)該事件時(shí),會(huì)同步調(diào)用多個(gè)事件處理程序。
在 .NET Framework 類庫中,事件是基于 EventHandler 委托和 EventArgs 基類的。
訂閱和取消訂閱事件
如果您想編寫引發(fā)事件時(shí)調(diào)用的自定義代碼,則可以訂閱由其他類發(fā)布的事件。例如,可以訂閱某個(gè)按鈕的 click 事件,以使應(yīng)用程序在用戶單擊該按鈕時(shí)執(zhí)行一些有用的操作。
使用 Visual Studio IDE 訂閱事件
如果看不到“屬性”窗口,請(qǐng)?jiān)凇霸O(shè)計(jì)”視圖中,右擊要為其創(chuàng)建事件處理程序的窗體或控件,然后選擇“屬性”。
在“屬性”窗口的頂部,單擊“事件”圖標(biāo)。
雙擊要?jiǎng)?chuàng)建的事件,例如 Load 事件。
Visual C# 會(huì)創(chuàng)建一個(gè)空事件處理程序方法,并將其添加到您的代碼中。或者,您也可以在“代碼”視圖中手動(dòng)添加代碼。例如,下面的代碼行聲明了一個(gè)在 Form 類引發(fā) Load 事件時(shí)調(diào)用的事件處理程序方法。
private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
還會(huì)在項(xiàng)目的 Form1.Designer.cs 文件的 InitializeComponent 方法中自動(dòng)生成訂閱該事件所需的代碼行。該代碼行類似于:
this.Load += new System.EventHandler(this.Form1_Load);
以編程方式訂閱事件
定義一個(gè)事件處理程序方法,其簽名與該事件的委托簽名匹配。例如,如果事件基于 EventHandler 委托類型,則下面的代碼表示方法存根:
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
使用加法賦值運(yùn)算符 (+=) 來為事件附加事件處理程序。在下面的示例中,假設(shè)名為 publisher 的對(duì)象擁有一個(gè)名為 RaiseCustomEvent 的事件。請(qǐng)注意,訂戶類需要引用發(fā)行者類才能訂閱其事件。
publisher.RaiseCustomEvent += HandleCustomEvent;
請(qǐng)注意,前面的語法是 C# 2.0 中的新語法。此語法完全等效于必須使用 new 關(guān)鍵字顯式創(chuàng)建封裝委托的 C# 1.0 語法:
publisher.RaiseCustomEvent += new CustomEventHandler(HandleCustomEvent);
還可以通過使用 lambda 表達(dá)式添加事件處理程序:
public Form1() { InitializeComponent(); // Use a lambda expression to define an event handler. this.Click += (s,e) => { MessageBox.Show( ((MouseEventArgs)e).Location.ToString());}; }
有關(guān)更多信息,請(qǐng)參見 如何:在 LINQ 外部使用 Lambda 表達(dá)式(C# 編程指南)。
使用匿名方法訂閱事件
如果以后不必取消訂閱某個(gè)事件,則可以使用加法賦值運(yùn)算符 (+=) 將匿名方法附加到此事件。在下面的示例中,假設(shè)名為 publisher 的對(duì)象擁有一個(gè)名為 RaiseCustomEvent 的事件,并且還定義了一個(gè) CustomEventArgs 類以承載某些類型的專用事件信息。請(qǐng)注意,訂戶類需要引用 publisher 才能訂閱其事件。
publisher.RaiseCustomEvent += delegate(object o, CustomEventArgs e) { string s = o.ToString() + " " + e.ToString(); Console.WriteLine(s); };
請(qǐng)務(wù)必注意,如果使用匿名函數(shù)訂閱事件,事件的取消訂閱過程將比較麻煩。這種情況下若要取消訂閱,必須返回到該事件的訂閱代碼,將該匿名方法存儲(chǔ)在委托變量中,然后將此委托添加到該事件中。一般來說,如果必須在后面的代碼中取消訂閱某個(gè)事件,則建議您不要使用匿名函數(shù)訂閱此事件。
取消訂閱
要防止在引發(fā)事件時(shí)調(diào)用事件處理程序,請(qǐng)取消訂閱該事件。要防止資源泄露,應(yīng)在釋放訂戶對(duì)象之前取消訂閱事件。在取消訂閱事件之前,在發(fā)布對(duì)象中作為該事件的基礎(chǔ)的多路廣播委托會(huì)引用封裝了訂戶的事件處理程序的委托。只要發(fā)布對(duì)象保持該引用,垃圾回收功能就不會(huì)刪除訂戶對(duì)象。
取消訂閱事件
使用減法賦值運(yùn)算符 (-=) 取消訂閱事件:
publisher.RaiseCustomEvent -= HandleCustomEvent;
所有訂戶都取消訂閱事件后,發(fā)行者類中的事件實(shí)例將設(shè)置為 null。
欄 目:C#教程
下一篇:理解C#編程中的靜態(tài)類和靜態(tài)成員以及密封類
本文標(biāo)題:結(jié)合Visual C#開發(fā)環(huán)境講解C#中事件的訂閱和取消訂閱
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/6739.html
您可能感興趣的文章
- 01-10C#調(diào)用WebService實(shí)例開發(fā)
- 01-10實(shí)現(xiàn)ASP.NET無刷新下載并提示下載完成的開發(fā)思路
- 01-10積累Visual Studio 常用快捷鍵的動(dòng)畫演示
- 01-10C#編程和Visual Studio使用技巧(下)
- 01-10C#編程和Visual Studio使用技巧(上)
- 01-10C#開發(fā)中的垃圾回收機(jī)制簡析
- 01-10C#微信開發(fā)(服務(wù)器配置)
- 01-10結(jié)合.net框架在C#派生類中觸發(fā)基類事件及實(shí)現(xiàn)接口事件
- 01-10C#開發(fā)Android百度地圖手機(jī)應(yīng)用程序(多地圖展示)
- 01-10C#微信公眾平臺(tái)開發(fā)之高級(jí)群發(fā)接口


閱讀排行
本欄相關(guān)
- 01-10C#通過反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10C#中split用法實(shí)例總結(jié)