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

C# 事件存取器自訂:大量事件記憶體優化實戰

     編輯:關於C#

為什麼需要自訂事件存取器?

當類別擁有大量事件(如 WinForms Control 超過 70 個事件)時,為每個事件建立獨立委派欄位會浪費記憶體。自訂 add/remove 存取器,搭配 EventHandlerList 鍵值儲存,可大幅降低記憶體佔用。

核心實作模式

using System;
using System.ComponentModel;

public class Control : Component {
    // 靜態唯讀物件作為鍵值,避免字串比對開銷
    static readonly object MouseDownKey = new object();
    static readonly object MouseUpKey = new object();

    // 基底類別 Component 提供 Events 屬性 (EventHandlerList)
    public event MouseEventHandler MouseDown {
        add => Events.AddHandler(MouseDownKey, value);
        remove => Events.RemoveHandler(MouseDownKey, value);
    }
    public event MouseEventHandler MouseUp {
        add => Events.AddHandler(MouseUpKey, value);
        remove => Events.RemoveHandler(MouseUpKey, value);
    }

    protected void OnMouseDown(MouseEventArgs e) {
        if (Events[MouseDownKey] is MouseEventHandler handler)
            handler(this, e);
    }
}

EventHandlerList 運作原理

  • 內部以單向鏈結串列儲存 键-委派 配對。
  • 新增/移除操作 O(n),但事件數量通常較少(< 100),效能可接受。
  • 唯讀索引子 Events[key] 回傳合併後的多播委派。

何時使用自訂存取器?

場景建議
事件數量 < 10直接用預設 event 宣告,簡潔明瞭
事件數量 > 20 或為基底控制項庫自訂存取器 + EventHandlerList
需動態新增/移除事件型別自訂存取器搭配 Dictionary

注意事項

  1. add/remove 區塊不可為空,否則編譯錯誤。
  2. 隱含參數 value 代表要新增/移除的委派,區塊區域變數不可命名為 value。
  3. 抽象事件(abstract event)不允許提供存取器實作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved