事件設計
更新:2007 年 11 月
事件是一種機制,可在發生動作時,讓應用程式特定的程式碼得以執行。事件會發生在關聯的動作發生之前 (預期事件) 或是發生在動作之後 (過去事件)。例如,當使用者按下視窗中的按鈕,即會引發過去事件,讓應用程式特定的方法得以執行。當系統引發事件時,事件處理常式委派會繫結到要執行的方法上。此事件處理常式會加入到事件中,好讓它可以在引發事件時叫用其方法。事件可以有事件特定的資料 (例如,按下滑鼠的事件可以包括與螢幕指標位置有關的資料)。
事件處理方法的簽章與事件處理常式委派的簽章相同;事件處理常式簽章會遵守下列慣例:
如需事件的詳細資訊,請參閱處理和引發事件。
要使用 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 程式庫的慣例、慣用語法和模式」一書。