2016-04-04 9 views
2

Ich lese, dass Delegierter unveränderliche Objekte sind.Delegierter immutability und Zuweisungsoperator

Wenn ich in ein Gewinde haben:

EventHandler handler = (s, e) => Console.WriteLine("..."); 
EventHandler copy = handler; 
copy(new object(), EventArgs.Empty); 

, die ein Thread Sicherheitsoperationen kopieren ist so, wenn ich copy(...) berufen, wenn ein anderer Thread den Delegaten aus handler keine Ausnahme auslösen kann eliminiert.

Jedoch Wenn ich machen, das heißt ,:

handler.GetHashCode() und copy.GetHashCode() sie beide wieder den gleichen Code.

Ich dachte, dass der Zuweisungsoperator eine neue Instanz dieser Delegierten und dass die neue Referenzgröße setzen in copy hatte tat ...

Wie kann somit copy und handler unabhängig sein, wenn sie beide Referenzen das gleiche Objekt im Speicher?

Verwirrt!

+0

Ihre eigentliche Frage scheint zu sein _ "bedeutet ein gleicher Hashcode, dass beide Variablen auf dieselbe Instanz verweisen" _, auf die die Antwort "nein" lautet. – CodeCaster

+2

@CodeCaster In diesem Fall verweisen beide Variablen jedoch auf dasselbe Objekt. – juharr

+1

Unveränderbar bedeutet, dass Sie das Objekt nicht ändern können. Sie können jedoch 'handler' ein neues Objekt zuweisen (oder es sogar auf null setzen), und diese Änderung wirkt sich nicht auf 'copy' aus. – juharr

Antwort

2

Ich dachte, dass der Zuweisungsoperator eine neue Instanz dieser Delegierten haben und dass die neue Referenz hatte in Kopie Variable setzen ...

Nein, ist es nicht eine neue Instanz zu erstellen. Er weist die aktuelle Instanz zu. Wenn also ein anderer Thread die registrierten Delegaten für das Ereignis ändert, bleibt die aktuelle Instanz gleich. Da der Event-Handler unveränderlich ist, führt die Zuweisung auf dem Event-Handler zu einem neuen Objekt.

Als eine Randnotiz: Strings sind auch unveränderlich, aber das Zuweisen eines Strings zu einem anderen kopiert es nicht, alias "erstellt eine neue Instanz".

+0

Nach der Kopie, wenn ein Thread auf 'Handler' den referenzierenden Delegaten mit' - = 'operator entfernt, verwendet er tatsächlich die Methode' Remove', die einen neuen 'Delegate' erzeugt, der den als Argument übergebenen Delegaten nicht enthält . Also auch wenn 'copy' auf den gleichen Delegaten zeigen, ist die Methode immer noch da ... – xdevel2000

+0

Ja, ist es. @xdevel2000 –