欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C#教程

當(dāng)前位置:主頁 > 軟件編程 > C#教程 >

結(jié)合Visual C#開發(fā)環(huán)境講解C#中事件的訂閱和取消訂閱

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C#教程|點(diǎn)擊: 次


類或?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。

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有