Dies ist eine Folgefrage zu dieser anderen Frage.
Hintergrund
Beim Arbeiten mit dem MSDN Delegates Tutorial (C #) sehe ich Folgendes:
Beachten Sie, dass sich die Methode, der er zugeordnet ist, nach dem Erstellen eines Delegaten nie ändert - Delegatenobjekte sind unveränderlich.
Und dann sehe ich im Codebeispiel Folgendes (ein wenig über den Code verteilen):
public delegate void ProcessBookDelegate(Book book);
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(PrintTitle));
bookDB.ProcessPaperbackBooks(new ProcessBookDelegate(totaller.AddBookToTotal));
Die Frage
Bei der Art und Weise, wie der Code hier geschrieben wird, wird für jeden Prozess ein neuer Delegat erstellt. Ich vermute, die Unveränderlichkeit ist relevant, wenn Sie versuchen, Dinge wie zu tun
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(totaller.AddBookToTotal);
was soll ... noch kompilieren wann thisIsATest
ist unveränderlich? Welches Problem hat Microsoft gelöst, indem es unveränderlich gemacht wurde? Auf welche Probleme würden wir stoßen, wenn C # 6 die Delegierten veränderlich machen würde?
BEARBEITEN
Ich glaube, die Unveränderlichkeit wird dies verhindern:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest.ChangeTheDelegateInABadFashion();
someFunction(thisIsATest); //This function works as normal
//because the delegate is unchanged
//due to immutability
aber die Unveränderlichkeit wird dies NICHT verhindern:
ProcessBookDelegate thisIsATest = new ProcessBookDelegate(PrintTitle);
thisIsATest = new ProcessBookDelegate(ChangeTheDelegateInABadFashion());
someFunction(thisIsATest); //This function works weird now because
//it expected the unchanged delegate
Bin ich in diesem Verständnis richtig?
quelle
Func<int>
1 das erste zurückgibt Mal heißt es, 2 die Sekunde usw. - dies verhält sich im Wesentlichen wie ein veränderliches Objekt.s[2] = 't'
.Gründe kurz:
Weitere Informationen finden Sie in diesen beiden Fragen zum Stapelüberlauf:
quelle
Standardgewindesicherheit glaube ich; Wenn Sie wissen, dass sich ein Delegierter niemals ändern wird, können Sie einige Annahmen darüber treffen
Insbesondere können Sie sicher sein, dass ein böser Code den Delegierten, den Sie an mehrere Funktionen übergeben, nicht ändern kann (auch nicht aus Versehen).
Dies kann dazu führen, dass Fehler nur schwer aufgespürt werden können und der Programmierer sich fragt, warum sein Delegierter nicht angerufen wurde
quelle
Die einfache Antwort lautet: Mutieren eines Delegierten macht wenig Sinn. Ein Delegat ist in hohem Maße eine Referenz auf eine Funktion, eine Reihe von ausführendem Code. Mutation, die darauf hindeutet, dass Sie diese Funktion mutieren.
Fragen Sie sich, wie würde diese Methode bei einem Delegierten aussehen und was würde sie tun? In gewissem Sinne würde es den Code dieser Funktion neu schreiben. Dies eröffnet der C # -Spezifikation und den Compiler-Implementierungen eine enorme (fast unlösbare) Komplexität für sehr geringen Nutzen bei hohen Leistungskosten. Daher die Einschränkung.
quelle