Share via


事件設計

更新:2007 年 11 月

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

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

  • 傳回型別為 Void

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

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

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

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

要使用 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 和 Brad Abrams 所著,並由 Addison-Wesley 於 2005 年發行的「Framework 設計方針:可重複使用之 .NET 程式庫的慣例、慣用語法和模式」一書。

請參閱

概念

自訂事件處理常式設計

其他資源

成員設計方針

開發類別庫的設計方針