2

次の C# コードがあるとします。

Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;

テストは がbと同じインスタンスではないことを示しているcため、明らかに+オペレーターがデリゲートの新しいインスタンスを作成しているように見えます。これは正しい仮定ですか?-instance を内部で再利用しますかb、それともメソッド/ターゲット情報を新しいインスタンスにコピーするだけですか?

デリゲートの演算子の実装が見つから+ないようです。デリゲート クラスに含まれていないようです。

誰でもこの問題に光を当てることができますか?

私が尋ねている理由は、タマネギのようにお互いを重ねるいくつかのクラスを作成していて、最も外側のレイヤーが内側のレイヤーを呼び出し、いくつかのデリゲートを取得し、それらのデリゲートにさらにメソッドをアタッチするためです.そうすることで、内部レイヤーから取得したデリゲートが何らかの形で変更されることが懸念されます。その場合、内部参照だけでなく、コピー/クローンを返す必要があります。

これは完全に私のライブラリの内部コードであることに注意してください。したがって、そのような内部データ構造を渡すことは一般的に悪い考えであることはわかっていますが、これらのクラスで安全に実行できる場合はそうします。

4

2 に答える 2

4

+=と同等Delegate.Combine()です。-=と同等Delegate.Remove()です。それぞれが新しいDelegateインスタンスを作成し、それを返します。

于 2009-03-12T10:35:55.803 に答える
4

ケントが言うように、 += は to を使用しDelegate.Combine、 -= は を使用しDelegate.Removeます。詳細については、私のイベント/デリゲートの記事を参照してください。

重要なことは、デリゲートが不変であることです。結合/削除を呼び出しても、呼び出したデリゲートはまったく変更されないため、何も複製する必要はありません。デリゲートで行うその他のことについても同じことが当てはまります。たとえば、呼び出しリストを取得し、返された配列の内容を変更しても、デリゲートが実際に行うことは変わりません。

(別の考え方が必要な場合は、これは String の動作と同じです。)

于 2009-03-12T10:37:42.370 に答える