共用方式為


事件設計

事件是一種機制,可在發生動作時,讓應用程式特定的程式碼得以執行。 事件會發生在關聯的動作發生之前 (預期事件) 或是發生在動作之後 (過去事件)。 例如,當使用者按下視窗中的按鈕,即會引發過去事件,讓應用程式特定的方法得以執行。 當系統引發事件時,事件處理常式委派會繫結到要執行的方法上。 此事件處理常式會加入到事件中,好讓它可以在引發事件時叫用其方法。 事件可以有事件特定的資料 (例如,按下滑鼠的事件可以包括與螢幕指標位置有關的資料)。

事件處理方法的簽章與事件處理常式委派的簽章相同; 事件處理常式簽章會遵守下列慣例:

  • 傳回型別為 Void

  • 第一個參數名稱為 sender,且型別為 Object。 這是引發事件的物件。

  • 第二個參數名稱為 e,且型別為 EventArgs 或為 EventArgs 的衍生類別;這是事件特定的資料。

  • 此方法剛好只會接受兩個參數。

如需事件的詳細資訊,請參閱處理和引發事件

事件用語需使用引發 (Raise),而不要使用引發 (Fire) 或觸發 (Trigger)。

要使用 System.EventHandler<T>,而不要手動建立新的委派來當做事件處理常式使用。

此方針主要適用於新的功能區域; 如果您要擴充在某個區域中已經使用非一般事件處理常式的功能,您可以繼續使用非一般事件處理常式來維持設計的一致性。

如果程式庫是以不支援泛型的 .NET Framework 版本為目標,將無法遵行此方針。

除非您確定此事件一定不會需要夾帶任何資料到事件處理方法 (這種情況下,可以直接使用 System.EventArgs 型別),否則請考慮使用 System.EventArgs 的衍生類別做為事件引數。

如果您定義可接受 EventArgs 執行個體的事件,而不是使用您定義的衍生類別,您將無法在較新版中將資料加入到事件中。 因此,較理想的方式是建立 EventArgs 的空白衍生類別, 如此可讓您在較新版本中將資料加入到事件中,而不需引入最新的變更。

要使用受保護的虛擬方法來引發每一個事件, 但是,這只適用於非密封類別上的非靜態事件,而不適用於結構、密封類別或靜態事件。

遵守這項方針將可讓衍生類別處理基底類別事件,而不會覆寫受保護的方法。 受保護的 virtual (在 Visual Basic 中為 Overridable) 方法的名稱應該與前置詞為 On 的事件名稱相同。 例如,名為 TimeChanged 的事件之受保護的虛擬方法會命名為 "OnTimeChanged"。

重要事項重要事項

不需要覆寫受保護的虛擬方法之衍生類別,也可以呼叫基底類別實作。即使不會呼叫此基底類別的實作,此基底類別還是必須繼續正常運作。

要使用型別為事件引數類別的參數 (此類別是引發事件的受保護方法之類別), 此參數應該命名為 e。

FontDialog 類別會提供下列方法,而此方法會引發 Apply 事件:

Protected Overridable Sub OnApply( ByVal e As EventArgs )
protected virtual void OnApply(EventArgs e);

當引發非靜態事件時,請勿將 null (Visual Basic 中為 Nothing) 傳遞為傳送者參數。

在靜態事件上,sender 參數應該是 null (Visual Basic 中為 Nothing)。

當引發事件時,請勿將 null (Visual Basic 中為 Nothing) 傳遞為事件資料參數。

如果沒有任何事件資料,請傳遞 Empty,而不要傳遞 null。

一定要為執行於事件處理方法中的任意程式碼做好準備。

請考慮將引發事件所在的程式碼放在 try-catch 區塊中,以避免因為從事件處理常式擲回未處理的例外狀況而讓程式終止。

請考慮引發使用者可以取消的事件, 這只適用於預期事件。

如果您要設計可以取消的事件,請使用 CancelEventArgs (而非 EventArgs) 做為事件資料物件 e 的基底類別。

Portions Copyright 2005 Microsoft Corporation. All rights reserved.

Portions Copyright Addison-Wesley Corporation. All rights reserved.

設計指引的詳細資訊,請參閱"框架設計準則:公約、 成語和可重複使用的模式。網路圖書館"書 Krzysztof Cwalina 和布拉德 · 艾布拉姆斯,2005年艾迪生 - 衛斯理,發表。

請參閱

概念

自訂事件處理常式設計

其他資源

成員設計方針

開發類別庫的設計方針