4

イベントを実装する場合、イベント ハンドラのコードを提供できaddますremove。ただし、イベントには次の 3 つの方法でアクセスできます。

MyEvent += Handler;                // add accessor
MyEvent -= Handler;                // remove accessor
MyEvent(this, EventArgs.Empty);    // not supported by an accessor

invokeそれを担当する別のアクセサが呼び出されることは明らかではないでしょうか? 私の考えは次のとおりです。

class BaseClass
{
  public virtual event EventHandler MyEvent { add; remove; protected invoke; }
}

class DerivedClass : BaseClass
{
  public override event EventHandler MyEvent
  {
    invoke
    {
      // new code before event
      base.MyEvent(this, ...);
      // new code after event
    }
  }
}

メソッドを実装する古いスタイルのパターンを知っています。OnMyEvent(...)ただし、このアプローチには 2 つの重要な欠点があります。

  1. イベント コードが分散している -> コード ベースが整理されていない
  2. イベントを簡単にリファクタリングできない (名前を変更するなど)

編集:明らかに、コンパイラ チームはこの機能用に既に設計されています ( を参照GetRaiseMethod())。

4

1 に答える 1

5

これは、自分が「所有」していないイベントを呼び出さないようにするための意図的なものです。

編集(編集に対処するため):継承されたクラスであっても、常にそれを呼び出すことができるかどうかは不明です。通常はそうです。したがって、一般的なパターンがうまく設定されています。

  • イベントを定義します (接頭辞が付いていませんOn)
  • On同じ名前で接頭辞EventArgsnull.
  • 常に仮想メソッドを介してイベントを発生させます

このパターンにより、柔軟性が向上します。メソッドを継承することで、イベントを変更または省略したり、イベント後の処理を実行したりできます。メソッドが存在しない場合、イベント呼び出しはプライベートです。

于 2012-07-31T09:39:12.003 に答える