首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

Effective C# 原則 35:優先覆寫虛擬函式,而非使用事件處理常式

     編輯:關於C#

兩種回應事件的機制

.NET 類別庫常提供兩種方式讓衍生類別回應系統事件:

  1. 覆寫基類虛擬函式(如 OnMouseDown)
  2. 附加事件處理常式(如 MouseDown += ...)

雖然兩者皆可達成目的,但適用情境截然不同。

為何在衍生類別內部應優先覆寫虛擬函式?

public class MyForm : Form
{
    protected override void OnMouseDown(MouseEventArgs e)
    {
        try {
            HandleMouseDown(e);
        } catch (Exception ex) {
            // 特定錯誤處理
        }
        // 必須呼叫基類實作,確保事件鏈上的其他處理常式被調用
        base.OnMouseDown(e);
    }
}

核心優勢:

  • 執行順序可控:覆寫方法最先執行,基類實作負責觸發事件鏈上的所有處理常式。若事件鏈中某處理常式拋出例外,後續處理常式將不被調用;但覆寫虛擬函式能保證衍生類別邏輯優先執行。
  • 效能更佳:事件機制需檢查委派鏈、迭代調用每個處理常式,額外耗費處理器時間。虛擬函式調用僅為單一方法分派,開銷極低。
  • 維護性更高:僅需維護單一覆寫方法;事件方式需同時維護「訂閱邏輯」與「處理常式本體」,兩處皆可能出錯。

何時必須使用事件?

事件專為外部消費者設計。例如:表單處理按鈕點擊(Button.Click),按鈕觸發事件、表單訂閱處理。若每個按鈕都建立衍生類別覆寫 OnClick,程式碼膨脹嚴重。事件提供:

  • 執行時期彈性:可動態增減處理常式,依應用程式狀態切換行為(如繪圖程式的滑鼠模式)。
  • 多播支援:單一事件可掛接多個處理常式,分別執行不同邏輯(如功能執行 + 狀態列更新)。

結論

衍生類別內部:優先覆寫虛擬函式(正確性、效能、可維護性最佳)。
外部物件回應:使用事件機制(鬆散耦合、動態彈性、多播需求)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved