日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Docs

 昵稱71011036 2020-08-10

1、

處理和引發(fā)事件

.NET 中的事件基于委托模型。 委托模型遵循觀察者設(shè)計(jì)模式,使訂閱者能夠向提供方注冊(cè)并接收相關(guān)通知。 事件發(fā)送方推送事件發(fā)生的通知,事件接收器接收該通知并定義對(duì)它的響應(yīng)。 本文介紹委托模型的主要組件、如何在應(yīng)用程序中使用事件以及如何在你的代碼中實(shí)現(xiàn)事件。

有關(guān)在 Windows 8.x Store 應(yīng)用中處理事件的信息,請(qǐng)參閱事件和路由事件概述。

事件

事件是由對(duì)象發(fā)送的用于發(fā)出操作信號(hào)的消息。 該操作可能是由用戶交互引起,例如單擊按鈕;也可能是由某些其他程序的邏輯導(dǎo)致,例如更改屬性值。 引發(fā)事件的對(duì)象稱為“事件發(fā)送方”。 事件發(fā)送方不知道哪個(gè)對(duì)象或方法將接收(處理)它引發(fā)的事件。 事件通常是事件發(fā)送方的成員,例如 Click 事件是 Button 類的成員,PropertyChanged 事件是實(shí)現(xiàn) INotifyPropertyChanged 接口的類的成員。

若要定義一個(gè)事件,可以在事件類簽名中使用 event(在 C# 中)或 Event(在 Visual Basic 中)關(guān)鍵字,并指定事件的委托類型。 委托在下一節(jié)中介紹。

通常,為了引發(fā)事件,您可以在 C# 中添加一個(gè)標(biāo)記為 protected 和 virtual 或在 Visual Basic 中標(biāo)記為 Protected 和 Overridable 的方法。 將此方法命名為 OnEventName;例如,OnDataReceived。 此方法應(yīng)接受一個(gè)指定事件數(shù)據(jù)對(duì)象(EventArgs 類型或派生類型)的參數(shù)。 您提供此方法以允許派生類重寫(xiě)引發(fā)事件的邏輯。 派生類應(yīng)始終調(diào)用基類的 OnEventName 方法,以確保注冊(cè)的委托接收事件。

下面的示例顯示如何聲明名為 ThresholdReached 事件。 該事件與 EventHandler 委托相關(guān)聯(lián)并且由 OnThresholdReached 方法引發(fā)。

C#復(fù)制

 

  1. class Counter
  2. {
  3. public event EventHandler ThresholdReached;
  4. protected virtual void OnThresholdReached(EventArgs e)
  5. {
  6. EventHandler handler = ThresholdReached;
  7. handler?.Invoke(this, e);
  8. }
  9. // provide remaining implementation for the class
  10. }

委托

委托是一種保存對(duì)方法的引用的類型。 委托是通過(guò)顯示所引用方法的返回類型和參數(shù)的簽名來(lái)聲明的,并可以僅保存與其簽名匹配的方法的引用。 因此,委托等同于類型安全函數(shù)指針或回叫。 委托聲明足以定義委托類。

委托在 .NET 中有許多用途。 在事件上下文中,委托是事件源和處理事件的代碼之間的媒介(或類似指針的機(jī)制)。 如上一節(jié)的例子所示,可以通過(guò)在事件聲明中包括委托類型來(lái)將委托和事件相關(guān)聯(lián)。 有關(guān)委托的詳細(xì)信息,請(qǐng)參閱 Delegate 類。

.NET 提供了 EventHandler 和 EventHandler<TEventArgs> 委托來(lái)支持大部分事件場(chǎng)景。 使用 EventHandler 委托處理不包含事件數(shù)據(jù)的所有事件。 使用 EventHandler<TEventArgs> 委托處理包含事件相關(guān)數(shù)據(jù)的事件。 這些委托沒(méi)有返回類型值,并且接受兩個(gè)參數(shù)(事件源的對(duì)象和事件數(shù)據(jù)的對(duì)象)。

委托是多播,這意味著它們可以保存對(duì)多個(gè)事件處理方法的引用。 有關(guān)詳細(xì)信息,請(qǐng)參閱 Delegate 參考頁(yè)。 委托提供了事件處理中的靈活性和精確控制。 委托人通過(guò)維護(hù)事件的已注冊(cè)事件處理程序列表來(lái)充當(dāng)引發(fā)事件的類的事件調(diào)度程序。

在 EventHandler 和 EventHandler<TEventArgs> 委托不可用的場(chǎng)景下,您可以定義一個(gè)委托。 要求你定義委托的場(chǎng)景非常少見(jiàn)的,例如,當(dāng)你必須處理無(wú)法識(shí)別泛型的代碼時(shí)。 在聲明中使用 delegate(在 C# 中)和 Delegate(在 Visual Basic 中)關(guān)鍵字標(biāo)記委托。 下面的示例說(shuō)明如何聲明 ThresholdReachedEventHandler 委托。

C#復(fù)制

 

public delegate void ThresholdReachedEventHandler(object sender, ThresholdReachedEventArgs e);

事件數(shù)據(jù)

與事件相關(guān)的數(shù)據(jù)可以通過(guò)事件數(shù)據(jù)類提供。 .NET 提供了許多事件數(shù)據(jù)類,用戶可以在自己的應(yīng)用程序中使用它們。 例如,SerialDataReceivedEventArgs 類是 SerialPort.DataReceived 事件的事件數(shù)據(jù)類。 .NET 遵循所有事件數(shù)據(jù)類以 EventArgs 結(jié)尾的命名模式。 您通過(guò)查看事件的委托來(lái)確定哪個(gè)事件數(shù)據(jù)類與事件相關(guān)聯(lián)。 例如,SerialDataReceivedEventHandler 委托包含 SerialDataReceivedEventArgs 類作為它的一個(gè)參數(shù)。

EventArgs 類是所有事件數(shù)據(jù)類的基類型。 當(dāng)一個(gè)事件沒(méi)有任何與其相關(guān)聯(lián)的數(shù)據(jù)時(shí),您也會(huì)用到 EventArgs 類。 當(dāng)您創(chuàng)建一個(gè)事件僅用來(lái)通知其他類出問(wèn)題了,不需要傳遞任何數(shù)據(jù)時(shí),請(qǐng)包括 EventArgs 類作為委托中的第二個(gè)參數(shù)。 當(dāng)沒(méi)有數(shù)據(jù)提供時(shí),您可以傳遞 EventArgs.Empty 值。 EventHandler 委托包括 EventArgs 類作為一個(gè)參數(shù)。

當(dāng)您想創(chuàng)建一個(gè)自定義的事件數(shù)據(jù)類時(shí),請(qǐng)創(chuàng)建一個(gè)派生自 EventArgs 的類,然后提供所需的所有成員,來(lái)傳遞與該事件相關(guān)的數(shù)據(jù)。 通常,應(yīng)使用與 .NET 相同的命名模式,并且事件數(shù)據(jù)類名稱應(yīng)以 EventArgs 結(jié)尾。

下面的示例演示了一個(gè)名為 ThresholdReachedEventArgs 的事件數(shù)據(jù)類。 它包含特定于引發(fā)事件的屬性。

C#復(fù)制

 

  1. public class ThresholdReachedEventArgs : EventArgs
  2. {
  3. public int Threshold { get; set; }
  4. public DateTime TimeReached { get; set; }
  5. }

事件處理程序

若要響應(yīng)事件,您需要在事件接收器中定義一個(gè)事件處理程序方法。 此方法必須與您正處理的事件的委托簽名匹配。 在事件處理程序中,當(dāng)事件引發(fā)時(shí)會(huì)執(zhí)行所需操作,例如在用戶單擊按鈕之后收集用戶輸入。 若當(dāng)事件發(fā)生時(shí)收到通知,您的事件處理程序方法必須訂閱該事件。

下面的示例演示與 c_ThresholdReached 委托的簽名匹配的 EventHandler 事件處理程序方法。 該方法訂閱 ThresholdReached 事件。

C#復(fù)制

 

  1. class Program
  2. {
  3. static void Main()
  4. {
  5. var c = new Counter();
  6. c.ThresholdReached += c_ThresholdReached;
  7. // provide remaining implementation for the class
  8. }
  9. static void c_ThresholdReached(object sender, EventArgs e)
  10. {
  11. Console.WriteLine("The threshold was reached.");
  12. }
  13. }

靜態(tài)和動(dòng)態(tài)事件處理程序

借助 .NET,訂閱者可以進(jìn)行靜態(tài)或動(dòng)態(tài)注冊(cè)以獲得事件通知。 對(duì)于其事件由靜態(tài)事件處理程序進(jìn)行處理的類,靜態(tài)事件處理程序?qū)ζ湔麄€(gè)生命周期有效。 通常為響應(yīng)某些條件程序邏輯,會(huì)在程序執(zhí)行期間顯式激活和停用動(dòng)態(tài)事件處理程序。 例如,如果僅在特定條件下需要事件通知,或如果應(yīng)用程序提供多個(gè)事件處理程序且由運(yùn)行時(shí)條件定義要使用的適當(dāng)事件處理程序,則可以使用動(dòng)態(tài)事件處理程序。 上一節(jié)中的示例演示如何動(dòng)態(tài)添加事件處理程序。 有關(guān)詳細(xì)信息,請(qǐng)查看 Visual Basic 中的事件和 C# 中的事件。

引發(fā)多個(gè)事件

如果您的類引發(fā)多個(gè)事件,編譯器會(huì)為每一個(gè)事件委托實(shí)例生成一個(gè)字段。 如果事件數(shù)量很大,則可能無(wú)法接受按一個(gè)委托計(jì)算一個(gè)字段的存儲(chǔ)成本。 對(duì)于這些情況,.NET 提供一個(gè)事件屬性,可以將其與選擇的另一數(shù)據(jù)結(jié)構(gòu)一起用于存儲(chǔ)事件委托。

事件屬性由事件聲明和事件訪問(wèn)器組成。 事件訪問(wèn)器是您定義的方法,用來(lái)從存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)添加和移除事件委托實(shí)例。 請(qǐng)注意,事件屬性要比事件字段慢,這是因?yàn)楸仨毾葯z索每個(gè)事件委托,然后才能調(diào)用它。 需在內(nèi)存和速度之間進(jìn)行權(quán)衡。 如果類定義許多不常引發(fā)的事件,那么需要實(shí)現(xiàn)事件屬性。 有關(guān)詳細(xì)信息,請(qǐng)參閱如何:使用事件屬性處理多個(gè)事件。

相關(guān)主題

相關(guān)主題
Title 描述
如何:拋出和使用事件 包含引發(fā)和使用事件的示例。
如何:使用事件屬性處理多個(gè)事件 演示如何使用事件屬性處理多個(gè)事件。
觀察程序設(shè)計(jì)模式 描述允許訂閱者向提供方注冊(cè)和接收通知的設(shè)計(jì)模式。
如何:在 Web 窗體應(yīng)用程序中使用事件 演示如何處理 Web 窗體控件引發(fā)的事件。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多