1


0

私は質問から始めて、そして質問をタイプすることで答えを見つけました、しかし削除する代わりに、私はそれがA)確認を得て、そしてB)他の人を助けることが役に立つかもしれないと思いました。

イベントがあり、アプリケーション内のいくつかの場所にリスナーが追加されている場合、すべてのリスナーを一度に削除する最善の方法は何ですか? たとえば、 …​

myPage.OnPageOpened = OpenPage;

あとで私のコードでは…​

myPage.OnPageOpened  -  = OpenPage;

しかし、もし私が未知のサードパーティ加入者を持っていて、すべてをクリアして最初から始める魔法のリセットボタンを押したいのであればどうしますか?

演算子オーバーロードはパブリックなので、EventHandlerに対して=および - =演算子をどこでも使用できます。 =オーバーロード演算子は非公開で、定義クラスでのみ呼び出すことができます。

したがって、定義クラスでは、これを使用してEventHandlerをクリアできます。

OnPageOpened = null。

そしてその機能を公開するために、私は…

public void ClearPageOpenedEvents(){OnPageOpened = null; }

あれは正しいですか?

3 Answer


1


それがそれを行う方法ですが、クラスの外の何かが、そのクラスがそのすべてのイベントリスナーを削除するべきであることをどのようにして知るのでしょうか。 誰かがあなたのコードを拡張/使用して継続的にそのイベントを期待している場合はどうなりますか?


1


はい。それで合っています。 その理由は、コンパイラが次のように、カバーの下に + private + `+ delegate +`オブジェクトを作成するためです。

private EventHandler pageOpened;

public EventHandler PageOpened
{
    add { pageOpened += value; }
    remove { pageOpened -= value; }
}

クラス内では、プライベートの `+ delegate `インスタンスへの参照があるため、割り当てを行うことができます。 必要な機能である場合、ターゲットをクリアするメソッドを必ず公開する必要があります。 ` delegate +`自体を公開したくありません。


0


イベントに代入演算子を使用することができます。これは、イベントの追加と削除が機能するためです。 Reflectorを使用すると、C#でイベントがどのように行われるかについて多くの光が当てられます。

の単純なクラスを考える

public class MyClass
{
  public event EventHandler MyEvent;
}

次のコードはコンパイル時に生成されます

public class MyClass
{
  private EventHandler MyEvent;

  public event EventHandler MyEvent;
}

したがって、 `+ MyEvent `を参照するときは、プライベートデリゲート変数 ` MyEvent `を参照します。 `+ = `および `-= `演算子は「特別」であり(演算子ではないため)、イベントに対して作成される ` add `および ` remove +`メソッドの呼び出しに変更されます(代入演算子自体を使用します)。

[MethodImpl(MethodImplOptions.Synchronized)]
public void add_MyEvent(EventHandler value)
{
  this.MyEvent = (EventHandler) Delegate.Combine(this.MyEvent, value);
}

[MethodImpl(MethodImplOptions.Synchronized)]
public void remove_MyEvent(EventHandler value)
{
    this.MyEvent = (EventHandler) Delegate.Remove(this.MyEvent, value);
}