Warum ist es nicht möglich, zusammengesetzte Zuweisungsoperatoren in C # zu überladen?


11

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.


3
Haben Sie einen Link für den neuen C ++ - Stil? Naiv erscheint Überladung +=zunächst absurd; Warum sollten Sie eine kombinierte Operation überlasten und nicht die Teile davon?
Telastyn

1
Ich glaube, der Begriff für diese ist "zusammengesetzte Zuweisungsoperatoren".
Ixrec

2
@greenoldman Telastyn implizierte wahrscheinlich, dass die Implementierung von + = in Bezug auf + natürlicher erscheint als umgekehrt, da + = semantisch eine Zusammensetzung von + und = ist. Nach meinem besten Wissen ist + call + = größtenteils ein Optimierungstrick.
Ixrec

1
@Ixrec: Manchmal macht a + = b Sinn, während a = a + b nicht: Bedenken Sie, dass Identität wichtig sein könnte, ein A kann nicht dupliziert werden, was auch immer. Manchmal macht a = a + b Sinn, während a + = b nicht: Betrachten Sie unveränderliche Zeichenfolgen. Man muss also tatsächlich entscheiden können, welche separat überlastet werden soll. Natürlich ist es eine gute Idee, den fehlenden automatisch zu generieren, wenn alle erforderlichen Bausteine ​​vorhanden sind und er nicht explizit deaktiviert wird. Nicht dass C # das atm erlaubt, afaik.
Deduplikator

4
@greenoldman - Ich verstehe diese Motivation, aber persönlich würde ich die *=Mutation eines Referenztyps als semantisch falsch empfinden .
Telastyn

Antworten:


12

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.


Vielen Dank, wenn es Ihnen nichts ausmacht, werde ich diese Frage etwas länger offen halten, und wenn Sie niemand mit der Begründung des tatsächlichen Designs schlägt, werde ich sie schließen, indem ich Ihre akzeptiere. Nochmals vielen Dank.
Greenoldman

@ Greenoldman - auch du solltest. Ich hoffe auch, dass jemand eine Antwort mit konkreteren Referenzen kommt.
Telastyn

Dies ist also ein Ort, an dem die Unmöglichkeit, sowohl bequem als auch eindeutig über den Zeiger und den Zeiger zu sprechen, seinen Kopf erhebt? Verdammt schade.
Deduplikator

"Die Leute haben behauptet, dass es Code verschleiert" - es ist jedoch immer noch wahr, haben Sie einige der F # -Bibliotheken gesehen? Bedienergeräusch. ZB quanttec.com/fparsec
Den
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.