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

漫談 Visual C# 元件設計方法(二):事件設計演進 — 從 Delegate 到 Lazy-Allocate 模式

     編輯:關於C語言

基礎事件模式:Delegate + event 關鍵字


public delegate void ProcessHandler(object sender);

public class Class1
{
    private event ProcessHandler _processHandler;

    public event ProcessHandler ProcessStart
    {
        add    { _processHandler += value; }
        remove { _processHandler -= value; }
    }

    public void Process()
    {
        _processHandler?.Invoke(this);
        // ... 業務邏輯
    }
}
  • delegate 相當於型別安全的函式指標
  • 單一 delegate 可串聯多個處理函式 (多播委派)

問題:事件數量大時的記憶體浪費

Windows Forms 控制項擁有數百個事件 (Click、MouseMove、Paint...),若每個事件皆宣告 private event Delegate _xxx,每個實例皆佔用大量欄位記憶體,即使從未訂閱。

.NET Framework 解法:Lazy-Allocate (延遲配置) 模式


public class Class1
{
    private EventHandlerList _events = new EventHandlerList(); // 或 Hashtable
    private static readonly object _processStartKey = new object();
    private static readonly object _processEndKey = new object();

    public event ProcessHandler ProcessStart
    {
        add    { _events.AddHandler(_processStartKey, value); }
        remove { _events.RemoveHandler(_processStartKey); }
    }

    public event ProcessHandler ProcessEnd
    {
        add    { _events.AddHandler(_processEndKey, value); }
        remove { _events.RemoveHandler(_processEndKey); }
    }

    public void Process()
    {
        var start = (ProcessHandler)_events[_processStartKey];
        start?.Invoke(this);
        // ...
        var end = (ProcessHandler)_events[_processEndKey];
        end?.Invoke(this);
    }
}

模式核心

  • 靜態鍵值物件:static readonly object _key — 全域唯一、零記憶體增量
  • 集中儲存:EventHandlerList 或 Hashtable — 僅在首次 add 時配置節點
  • 未使用零成本:未訂閱事件不佔用任何委派物件記憶體

這正是 Windows Forms 控制項能擁有數百事件卻輕量化的關鍵架構決策。

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