Frage

Sagen, dass ich die folgende C # -Code haben:

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 richtige Annahme? Ist es die b-Instanz intern wiederverwenden, oder ist es nur die Methode / Zielinformationen auf eine neue Instanz kopieren?

ich die Umsetzung des + Betreiber für die Delegierten zu finden, um nicht in der Lage scheinen, die Delegate-Klasse scheint nicht zu enthalten.

Kann jemand etwas Licht ins Dunkel bringen?

Der Grund, ich frage ist, dass ich einige Klassen bin zu schaffen, die sich umeinander wie Zwiebeln Schicht und die äußerste Schicht eine innere Schicht nennen, einige Delegierte erhalten und dann weitere Methoden an Teilnehmer anhängen, ich bin nur besorgt, dass in irgendeiner Weise damit die Delegierten ich von der inneren Schicht erhalten verändern wird, wobei in diesem Fall ich brauche Kopien / Klone zurückzukehren, anstatt nur die internen Referenzen.

Beachten Sie, dass diese rein interner Code zu meiner Bibliothek ist, also, während ich weiß, dass Strukturen interne Daten wie die Weitergabe von einer schlechte Idee ist in der Regel, wenn ich es sicher mit diesen Klassen tun kann, dann werde ich das tun.

War es hilfreich?

Lösung

Wie Kent sagt, + = verwendet, um Delegate.Combine , und - = verwendet Delegate.Remove . Sehen Sie mein events / Delegierten Artikel für weitere Informationen.

Das Wichtigste ist, dass die Delegierten unveränderlich sind - Aufruf für Mähdrescher / Remove ändert nichts an den Delegierten Sie es überhaupt rufen - so Sie brauchen nichts zu klonen. Das gleiche gilt für alles, was Sie mit den Delegierten zu tun. Wenn Sie die Aufrufliste und ändern Sie den Inhalt des zurückgegebenen Arrays zu erhalten, zum Beispiel, dass wird sich nicht ändern, was die Delegierten tatsächlich tut

(Das ist wie String Verhalten, wenn Sie eine andere Art des Denkens über sie wollen.)

Andere Tipps

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top