共用方式為


事件設計

注意

此內容是由 Pearson Education, Inc. 授權轉載自架構設計指導方針:可重複使用 .NET 程式庫的慣例、慣用語和模式,第 2 版。 該版於 2008 年出版,該書自那以後已於第三版進行了全面修訂。 此頁面上的某些資訊可能已過期。

事件是最常使用的回呼形式 (可讓架構呼叫使用者程式碼的建構)。 其他回呼機制包括接受委派的成員、虛擬成員和介面型外掛程式。可用性研究的資料指出,大部分開發人員使用事件比使用其他回呼機制更為得心應手。 事件與 Visual Studio 和多種語言緊密整合。

請務必注意,有兩組事件:在系統狀態變更之前引發的事件稱為前置事件,以及在狀態變更之後引發的事件稱為後置事件。 前置事件的範例是 Form.Closing,會在關閉表單之前引發。 後置事件的範例是 Form.Closed,會在關閉表單之後引發。

✔️ 請對事件使用「引發」一詞,而不是「啟動」或「觸發」。

✔️ 請使用 System.EventHandler<TEventArgs> 而不是手動建立新的委派,以作為事件處理常式使用。

✔️ 請考慮使用 EventArgs 的子類別作為事件引數,除非您絕對確定事件不需要將任何資料傳送至事件處理方法,在該情況下,您可以直接使用 EventArgs 類型。

如果您直接使用 EventArgs 來寄送 API,您將永遠無法新增任何要與事件一起攜帶的資料,而不中斷相容性。 如果您使用子類別,即使一開始是空的,您也可以視需要將屬性新增至子類別。

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

方法的目的是要提供方法,讓衍生類別使用覆寫來處理事件。 覆寫是一種更有彈性、更快速且更自然的方式,可處理衍生類別中的基底類別事件。 依照慣例,方法的名稱應該以 "On" 開頭,後面接著事件的名稱。

衍生類別可以選擇不要在其覆寫中呼叫方法的基底實作。 在基底類別正常運作所需的方法中不包含任何處理,以備妥此作業。

✔️ 請將一個參數用於引發事件的受保護方法。

參數應該命名為 e,而且應該輸入為事件引數類別。

❌ 引發非靜態事件時,請勿以傳送者身分傳遞 Null。

✔️ 當引發靜態事件時,請以傳送者身分傳遞 Null。

❌ 引發事件時,請勿傳遞 Null 作為事件資料參數。

如果您不想將任何資料傳遞至事件處理方法,則應該傳遞 EventArgs.Empty。 開發人員預期此參數不是 Null。

✔️ 請考慮引發終端使用者可以取消的事件。 這只適用於前置事件。

使用 System.ComponentModel.CancelEventArgs 或其子類別做為事件引數,以允許使用者取消事件。

自訂事件處理常式設計

在某些無法使用 EventHandler<T> 的情況下,例如當架構需要使用舊版的 CLR 時,不支援泛型。 在這種情況下,您可能需要設計和開發自訂事件處理常式委派。

✔️ 請針對事件處理常式使用 void 的傳回型別。

事件處理常式可以在多個物件上叫用多個事件處理方法。 如果允許事件處理方法傳回值,則每個事件調用都會有多個傳回值。

✔️ 請使用 object 做為事件處理常式第一個參數的類型,並將其稱為 sender

✔️ 請使用 System.EventArgs 或其子類別做為事件處理常式的第二個參數類型,並將其稱為 e

❌ 事件處理常式上禁止有兩個以上的參數。

Portions © 2005, 2009 Microsoft Corporation. 著作權所有,並保留一切權利。

獲 Pearson Education, Inc. 的授權再版,從 Krzysztof Cwalina 和 Brad Abrams 撰寫,並在 2008 年 10 月 22 日由 Addison-Wesley Professional 出版,作為 Microsoft Windows Development Series 一部份的 Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 節錄。

另請參閱