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

Visual C# 元件設計精要:屬性延遲載入、事件記憶體優化與 Helper 類別模式

     編輯:關於C#

前言

優秀的元件設計不僅功能正確,更要在記憶體使用、效能、擴充性上經得起推敲。本文探討三大核心技巧:屬性的 Lazy-Allocate (延遲配置)、事件的 EventHandlerList 優化、Static Helper Object 模式。

1. 屬性延遲配置

預先配置


public class Class1
{
    private MyData _data = new MyData(); // 建構子即配置
    public MyData Data => _data;
}

問題:若 MyData 昂貴且不一定被存取,浪費記憶體。

延遲配置


public class Class1
{
    private MyData _data;
    public MyData Data
    {
        get
        {
            if (_data == null) _data = new MyData();
            return _data;
        }
    }
    public Class1() { } // 建構子不配置
}

優點:以極小的判斷成本換取未使用時的記憶體節省。ASP.NET Style 屬性即採此模式。

2. 事件記憶體優化:EventHandlerList

傳統做法:每個事件一個委派欄位


private EventHandler _click;
private EventHandler _doubleClick;
// ... 數百個事件 → 數百個欄位,每個實例皆佔用
public event EventHandler Click { add { _click += value; } remove { _click -= value; } }

.NET Framework 模式:集中儲存於 EventHandlerList


using System.ComponentModel;

public class Component1 : Component
{
    private static readonly object EventClick = new object();
    private static readonly object EventDoubleClick = new object();

    public event EventHandler Click
    {
        add { Events.AddHandler(EventClick, value); }
        remove { Events.RemoveHandler(EventClick, value); }
    }
    public event EventHandler DoubleClick
    {
        add { Events.AddHandler(EventDoubleClick, value); }
        remove { Events.RemoveHandler(EventDoubleClick, value); }
    }

    protected virtual void OnClick(EventArgs e)
    {
        EventHandler handler = (EventHandler)Events[EventClick];
        handler?.Invoke(this, e);
    }
}

關鍵點:

  • Component 基類提供 Events 屬性 (EventHandlerList)。
  • 靜態 object 鍵值僅佔用一份記憶體,所有實例共用。
  • 只有真正訂閱事件時,才在 List 中配置節點。
  • 實例數千、事件數百時,記憶體節省極為可觀。

3. Static Helper Object 模式

C# 不允許全域函數/變數,善用 sealed + private constructor + static methods 封裝通用工具函數。


public sealed class DomainHelper
{
    private DomainHelper() { } // 防止實例化與繼承
    public static string GetCurrentDomainDir() => AppDomain.CurrentDomain.BaseDirectory;
}

// 使用
MessageBox.Show(DomainHelper.GetCurrentDomainDir());

優點:命名空間分組、避免重複程式碼、IntelliSense 易發現、單元測試友善。

結語

這三大技巧體現「以空間換時間」與「集中管理」的設計智慧。延遲配置減少不必要的物件建立,EventHandlerList 解決事件爆炸的記憶體問題,Helper Object 提供乾淨的工具函數組織方式。熟練運用於自訂控制項、元件庫開發,能顯著提升專案品質。

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