8

コンポーネントから派生したクラスでは、次のように宣言されたイベントが表示されることがあります。

private static readonly object LoadEvent = new object();
public event EventHandler<MyEventArgs> Load
{
    add { Events.AddHandler(LoadEvent, value); }
    remove { Events.RemoveHandler(LoadEvent, value); }
}

protected virtual void OnLoad(MyEventArg e)
{
    var evnt = (EventHandler<MyEventArg>)Events[LoadEvent];
    if (evnt != null) 
        evnt(this, e);
}

ただの代わりに:

public event EventHandler<MyEventArgs> Load;

protected virtual void OnLoad(MyEvent e)
{
   if (Load != null)
       Load(this, e);
}

短いメソッドを使用するようにリファクタリングしたいのですが、欠落しているComponentEventHanderListを使用することにいくつかの利点がある場合に備えて躊躇しています。

私が現在考えることができる唯一の利点は次のとおりです。

  • コンポーネントが破棄されると、EventHandlerList内のすべてのアイテムが削除され、事実上、イベントハンドラーのフックが自動的に解除されます。
  • アタッチされたすべてのデリゲートが単一のEventHandlerListに入るため、メモリの断片化が少なくなる可能性があります。

他に何かありますか?

(これは、イベントでの明示的な追加と削除の一般的な使用に関する質問ではありません。)

4

1 に答える 1

12

これは、まばらなイベントに適しています。UIコントロールには、数十(場合によっては100以上)のイベントが発生する傾向があります。それぞれにフィールドのようなイベントが使用された場合、各イベントには参照バッキングフィールドが必要です。100のイベントがある場合、つまり、サブスクライブされているイベントが1つではない場合でも、x86では400バイト、x64では800バイトになります。

例として、winformsには、を追加する前にSystem.Windows.Forms.Form91のイベントがあります。すべてのインスタンスには少なくとも69があります。Control

それで; いくつかのラベル、入力ボックス、およびボタンを備えたWindowsフォームには、追加の2000参照フィールド(x86では16k)を簡単に含めることができ、そのほとんどは何もしていません

これEventHandlerListは本質的にキー/値のルックアップです。つまり、サブスクライブされているイベントが3つだけの場合(「クリック」と他のいくつかのイベントを考えています)、必要なメモリ量はわずかです。

于 2012-08-10T05:35:38.710 に答える