Der Titel ist irreführend, bitte lesen Sie die gesamte Frage :-) .
Mit "zusammengesetzter Zuweisungsoperator" habe ich op=
zum Beispiel ein solches Konstrukt im Sinn +=
. Der reine Zuweisungsoperator ( =
) gehört nicht zu meiner Frage.
Mit "warum" meine ich keine Meinung, sondern eine Ressource (Buch, Artikel usw.), wenn einige der Designer oder ihre Mitarbeiter usw. ihre Argumentation ausdrücken (dh die Quelle der Designauswahl).
Ich bin verwirrt über die Asymmetrie in C ++ und C # ( ja, ich weiß, dass C # nicht C ++ 2.0 ist ) - in C ++ würden Sie den Operator überladen +=
und dann fast automatisch einen geeigneten +
Operator schreiben, der auf dem zuvor definierten Operator basiert . In C # ist es umgekehrt - Sie überladen +
und +=
werden für Sie synthetisiert.
Wenn ich mich nicht irre, führt der spätere Ansatz zu einer Optimierung im Falle einer tatsächlichen +=
, da ein neues Objekt erstellt werden muss. Ein solcher Ansatz muss also einen großen Vorteil haben, aber MSDN ist zu schüchtern, um darüber zu berichten.
Und ich frage mich, was dieser Vorteil ist. Wenn Sie also in einem C # -Buch, einem Tech-Talk-Video oder einem Blogeintrag eine Erklärung gefunden haben, bin ich für die Referenz dankbar.
Das nächste, was ich gefunden habe, ist ein Kommentar im Eric Lippert-Blog. Warum sind überladene Operatoren in C # immer statisch? von Tom Brown. Wenn zuerst die statische Überladung entschieden wurde, wird lediglich festgelegt, welche Operatoren für Strukturen überladen werden können. Dies bestimmt weiter, was für Klassen überladen werden kann.
quelle
+=
zunächst absurd; Warum sollten Sie eine kombinierte Operation überlasten und nicht die Teile davon?*=
Mutation eines Referenztyps als semantisch falsch empfinden .Antworten:
Ich kann die Referenz dafür nicht finden, aber ich habe verstanden, dass das C # -Team eine vernünftige Teilmenge der Operatorüberladung bereitstellen wollte. Zu dieser Zeit hatte die Überlastung des Bedieners einen schlechten Ruf. Die Leute behaupteten, dass es Code verschleiert und nur für das Böse verwendet werden könne. Zum Zeitpunkt der Entwicklung von C # hatte Java uns gezeigt, dass keine Überladung von Operatoren ärgerlich war.
Also wollte C # die Überlastung des Bedieners ausgleichen, damit es schwieriger war, Böses zu tun, aber man konnte auch nette Dinge machen. Das Ändern der Semantik der Zuweisung war eines der Dinge, die als immer böse angesehen wurden. Indem es erlaubt
+=
und seine Verwandten überlastet werden, würde es so etwas erlauben. Wenn beispielsweise+=
die Referenz mutiert wird, anstatt eine neue zu erstellen, folgt sie nicht der erwarteten Semantik, was zu Fehlern führt.quelle