10

例えば:

delegate void SomeDelegate();

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

SomeDelegate c = a + b;

最後の行では、何にa + b変換されますか?+演算子を使用せずにそれらを追加する方法に興味があります。

4

2 に答える 2

7

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の呼び出しリストには、Method1、Method2、およびDelegateMethodの3つのメソッドが含まれています。元の3つのデリゲート、d1、d2、およびd3は変更されません。allMethodsDelegateが呼び出されると、3つのメソッドすべてが順番に呼び出されます。デリゲートが参照パラメーターを使用する場合、参照は3つのメソッドのそれぞれに順番に渡され、1つのメソッドによる変更は次のメソッドに表示されます。メソッドのいずれかがメソッド内でキャッチされない例外をスローすると、その例外はデリゲートの呼び出し元に渡され、呼び出しリスト内の後続のメソッドは呼び出されません。

アップデート

両方のデリゲートはSystem.Delegateから派生します。メソッドを使用しcombine()て、2つのデリゲートを一緒に追加できます。

于 2012-11-25T07:15:13.363 に答える
4

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 つの Delegate オブジェクトの呼び出しリストを組み合わせて新しいインスタンスが作成されます。

于 2015-07-22T02:21:50.483 に答える