2011-11-15 5 views
6

? 「仕事」とは、MethodAがExternalObject.Clickイベントから退会されることを意味します。C#のイベントとクラスメソッド

そして、他の関連質問:インスタンスメソッドではなく、デリゲートのインスタンスを使用した場合に舞台裏で何が起こる

(上記のような)は、デリゲートのこの原因暗黙的に作成していますか?

どう-=オペレータは、代表者との間の比較を行いん - 参照またはより洗練された問題が発生したかもしれない何かで?

答えて

8

はい、好きなように動作します。

比較基準によるものであり、それはあなたがいる限り、それは同じオブジェクトの同じメソッドを指すように、異なるデリゲートを解除することができることを意味する値です。

言い換えれば、これはうまく動作しますが:

public MethodB() 
{ 
    ExternalObject.Click +=() => { return 10; }; 
} 

public MethodC() 
{ 
    ExternalObject.Click -=() => { return 10; }; 
} 

メソッドが同じコードが含まれているが、それらが考慮されています。匿名メソッドが異なっていたと知って

var delegate1 = new ExternalObjectClickEventHandler(MethodA); 
var delegate2 = new ExternalObjectClickEventHandler(MethodA); 
ExternalObject.Click += delegate1; 
ExternalObject.Click -= delegate2; 

、あなたはこれを行うことはできません異なるので、これは動作しません。つまり、MethodCは、MethodBに追加した代理人の登録を解除しません。この問題を解決するための

、あなたはこのように、呼び出しの間にデリゲートを保存する必要があります、

private ExternalObjectClickEventHandler _ClickEventHandler; 
public MethodB() 
{ 
    _ClickEventHandler =() => { return 10; }; 
    ExternalObject.Click += _ClickEventHandler; 
} 

public MethodC() 
{ 
    ExternalObject.Click -= _ClickEventHandler; 
} 

しかし、あなたが示したコード動作します。

ExternalObject.Click += MethodA; 
ExternalObject.Click += new ExternalObjectClickEventHandler(MethodA); 

第二のコードが最初から生成されたものである(と仮定すると:それは生成されたコードに来るとき、次の2つのコード行が同一であることである舞台裏何が起こるか、あなたの質問については

、イベントの種類示されているようです。)

最初の構文)は、いくつかの点であった(あなたは2番目の構文を書いていたかのように、コンパイラによって翻訳さ「シンタックスシュガー」として追加。これは、コンパイルしたものが正しいタイプの100%を見つけ出すことができる場合にのみ発生することに注意してください。コンパイラがあなたの意図したことを理解できなかったため、完全修飾構文を使用しなければならなかったいくつかのケース(私は今思い出すことができません)を見ました。特に、メソッドオーバーロードとジェネリックスは、この点でそれを混乱させる可能性があります。

+0

徹底的な回答ありがとうございます。 – kubal5003

3

はい、MethodAが解除されます。私は100%わからないんだけど、私は= this.MethodAがバックグラウンドでデリゲートに変換さだと思う2番目の質問について

+0

+1。 'this.MethodA'は暗黙のうちにデリゲートに変換されます。 – kol

関連する問題