2009-03-12 8 views
2

sagen, dass ich die folgende C# -Code haben:Bei der Verkettung von .NET-Delegaten, wie werden die ursprünglichen Instanzen (re) verwendet?

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

Tests zeigt an, dass b nicht dieselbe Instanz wie c ist, so eindeutig die + Betreiber scheint eine neue Instanz des Delegaten zu erstellen. Ist das eine korrekte Annahme? Wird die b -instanz intern wiederverwendet oder kopiert sie einfach die Methoden-/Zielinformationen in eine neue Instanz?

Ich bin nicht in der Lage, die Implementierung des +-Operators für Delegaten zu finden, die Delegate-Klasse scheint es nicht zu enthalten.

Kann jemand etwas zu diesem Thema beleuchten?

Der Grund, warum ich frage ist, dass ich einige Klassen erstellen, die sich wie Zwiebeln umeinander schichten, und die äußerste Schicht wird eine innere Ebene aufrufen, einige Delegierte erhalten und dann weitere Methoden an diese Delegierten anhängen, Ich bin nur besorgt, dass dies die Delegierten, die ich von der inneren Schicht erhalte, in irgendeiner Weise ändern wird. In diesem Fall muss ich Kopien/Klone zurückgeben, anstatt nur die internen Referenzen.

Beachten Sie, dass dies vollständig interner Code für meine Bibliothek ist. Obwohl ich weiß, dass die Weitergabe interner Datenstrukturen im Allgemeinen eine schlechte Idee ist, wenn ich es mit diesen Klassen sicher machen kann, werde ich dies tun.

Antwort

4

Wie Kent sagt, verwendet + = Delegate.Combine, und - = Delegate.Remove. Siehe meine events/delegates article für weitere Informationen.

Wichtig ist, dass Delegaten unveränderlich sind - der Aufruf von Combine/Remove ändert nicht den Delegaten, den Sie überhaupt aufrufen - Sie müssen also nichts klonen. Das gleiche gilt für alles, was Sie sonst mit dem Delegaten tun: Wenn Sie beispielsweise die Aufrufliste aufrufen und den Inhalt des zurückgegebenen Arrays ändern, ändert das nichts an dem, was der Delegierte tatsächlich tut.

(Dies ist genau wie das Verhalten von String, wenn Sie eine andere Art darüber nachdenken wollen.)

+0

Danke, das vereinfacht alles. –

4

+= entspricht Delegate.Combine(). -= entspricht Delegate.Remove(). Jeder erstellt eine neue Delegate Instanz und gibt sie zurück.