2012-11-25 5 views
7

:最後の行で代理人の結合に+演算子はどのように機能しますか?たとえば

delegate void SomeDelegate(); 

SomeDelegate a = new SomeDelegate(() => Console.WriteLine("A")); 
SomeDelegate b = new SomeDelegate(() => Console.WriteLine("B")); 

SomeDelegate c = a + b; 

、何a + bはに翻訳していますか?私はちょうど私が+オペレータを使用せずにそれらを追加する方法が不思議です。

+0

これは有効なC#コードであることはわかりませんでした。 – rekire

+0

@rekire:最初の行は関数の外にあり、次の3行は1つになります。 –

答えて

5

http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx - さらに検索:呼び出されたとき

デリゲートは、複数のメソッドを呼び出すことができます。これはマルチキャストと呼ばれる です。デリゲートの メソッドのリスト(呼び出しリスト)に余分なメソッドを追加するには、加算または加算の代入演算子( '+'または '+ =')を使用して2つの代理人を追加するだけです。たとえば、次のように

MethodClass obj = new MethodClass(); 
Del d1 = obj.Method1; 
Del d2 = obj.Method2; 
Del d3 = DelegateMethod; 

//Both types of assignment are valid. 
Del allMethodsDelegate = d1 + d2; 
allMethodsDelegate += d3; 

この時点でallMethodsDelegateは、その 呼び出しリスト-方法1、方法2、およびDelegateMethodで3つのメソッドを含んでいます。元の 3人の代理人d1、d2、およびd3は変更されません。 allMethodsDelegateが呼び出されると、3つのメソッドがすべて順に呼び出されます。 デリゲートが参照パラメータを使用する場合、参照は、順に の3つのメソッドのそれぞれに順番に渡され、 のいずれかのメソッドによる変更が次のメソッドから見えます。メソッド のいずれかが例外をスローし、メソッド内でキャッチされない場合、その 例外がデリゲートの呼び出し元に渡され、呼び出しリストの後続のメソッドが呼び出されません。

更新

両代表団は、あなたが2つのデリゲートを追加するcombine()メソッドを使用することができますSystem.Delegateから派生。

+0

うん、私は追加作品を知っている。私は追加がどのように働くのか尋ねています。たとえば、+演算子を使用せずに全く同じ動作をシミュレートするとします。使用する機能はありますか? –

+0

ああ、わかったよ、更新された。 – Prescott

+0

あなたはこれを次のようにキャストしなければなりません: 'SomeDelegate c =(SomeDelegate)Delegate.Combine(a、b);'? +演算子は内部でもそれを行いますか? –

3

スタティックメソッドDelegate.Combineを使用しています。

SomeDelegate c = Delegate.Combine(a, b) as SomeDelegate; 

+=演算子を使用する場合、実際には同じです。

// This is the same... 
eventSource.onEvent += OnEvent; 

// ...as this. 
eventSource.onEvent = Delegate.Combine(
    eventSource.onEvent, 
    Delegate.CreateDelegate(typeof(EventSource.OnEvent), this, "OnEvent") 
    ) as EventSource.OnEvent; 

MulticastDelegateクラス(delegateキーワードの後ろのクラス)の呼び出しのリストを持っていますが、このリストは不変です。デリゲートを+=演算子と組み合わせるたびに、新しいMulticastDelegateインスタンスが作成され、前の2つのデリゲートオブジェクトの呼び出しリストが結合されます。

関連する問題