2011-07-08 7 views
3
サンプルに対する

....イベントを削除するには?

SampleClass:

public class SampleClass 
{ 
    public delegate void BeforeEditorHandle(); 
    public event BeforeEditorHandle OnBeforeEditor; 
} 

MainMethod

static void Main(string[] args) 
    { 
     SampleClass sc = new SampleClass(); 
     // Add Event 
     sc.OnBeforeEditor +=new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor); 
     // Remove Event 
     sc.OnBeforeEditor -= new SampleClass.BeforeEditorHandle(sc_OnBeforeEditor); 

    } 

そして、私はこのようなダイナミックでイベントを追加した場合...↓

sc.OnBeforeEditor +=() => { }; 

のようなイベントを削除してください

しかし、私は、私はイベントにあまりにも多くの情報源を持っている場合、これは非常に醜いだと思う.... は誰が私にイベントをしてください削除するための最良の方法を教えてください。

答えて

6

を私はここにあなたのコードは動作しませんかなり確信している:

そして、私はこのようなダイナミックな...↓

sc.OnBeforeEditor +=() => { }; 

でイベントを追加した場合、私は↓

のようなイベントを削除する必要があります
sc.OnBeforeEditor -=() => { }; 

ラムダを修正再表示すると、新しい別のラムダを作成するためです。

古い参照を格納し、退会するためにそれを使用する必要があります。

BeforeEditorHandle myHandler=() => { } 
sc.OnBeforeEditor += myHandler; 

... 
sc.OnBeforeEditor -= myHandler; 

簡単にあなたが(たとえばList<BeforeEditorHandle>について)コレクションであなたのイベントハンドラを収集することができ退会について。

+0

ありがとう....私のサンプルで間違っています.... :) – shenhengbin

+0

何を変更しましたか?編集の矛盾があったと思う。 – CodesInChaos

+0

あなたの '...'の前にスペースを4つだけ追加しました:) – Oded

8

あなたは、あなたがして購読することができます変数にイベントハンドラ/ラムダを割り当て、解除することができます

var myHandler =() => { }; 

sc.OnBeforeEditor += myHandler; 

sc.OnBeforeEditor -= myHandler; 
+0

ありがとうございます。 – shenhengbin

+0

「myHandler」と明示的に入力する必要があります。( '暗黙的に型指定されたローカル変数にラムダ式を代入することはできません') – CodesInChaos

2

MSDNから:

あなたがそれを購読する匿名 機能を使用する場合は、 簡単 イベントから退会することができないことに注意することが重要です。このシナリオでは 退会、あなたが、イベントをサブスクライブデリゲート 変数に 匿名メソッドを保存し、その後 イベントにデリゲートを追加 コードに戻って 必要があります。一般的に、私たちは、あなたがあなたの コード内のいくつかの後の時点で イベントから退会する必要があります 場合は、イベントをサブスクライブするために匿名 機能を使用しない をお勧めします。 匿名関数の詳細については、匿名の 関数(C#プログラミングガイド)を参照してください。

関連する問題