F # hat eine praktische Funktion "mit", zum Beispiel:
%Vor%F # erstellt das Schlüsselwort "mit", da die Datensatztypen standardmäßig unveränderbar sind.
Nun, ist es möglich, eine ähnliche Erweiterung in C # zu definieren? Scheint, es ist ein bisschen schwierig, wie in C # ich bin mir nicht sicher, wie man eine Zeichenfolge konvertiert
%Vor%zu einem Delegaten oder Ausdruck?
Oder mit einem Kopierkonstruktor:
%Vor%Und eine kleine Variation von George's exzellentem Vorschlag, der mehrere Aufgaben zulässt:
%Vor%Ich würde wahrscheinlich die zweite verwenden, da (1) jede allgemeine Lösung unnötig langsam und verschlungen wird; (2) es hat die am nächsten liegende Syntax zu dem, was Sie wollen (und die Syntax tut, was Sie erwarten); (3) F # copy-and-update Ausdrücke sind ähnlich implementiert.
Alternativ zur Lambda-Funktion können Sie Parameter mit Standardwerten verwenden. Das einzige kleine Problem ist, dass Sie einen Standardwert auswählen müssen, dh ändert diesen Parameter nicht (für Referenztypen), aber null
sollte eine sichere Wahl sein:
Sie müssen die Methode selbst definieren, aber das ist immer der Fall (es sei denn, Sie werden die Reflexion verwenden, die weniger effizient ist). Ich denke, die Syntax ist auch ziemlich nett. Wenn du es so schön wie in F # machen willst, musst du F #: -)
verwenden Es gibt keine native Fähigkeit, dies in C # zu tun, kurz vor einer Erweiterungsmethode, aber zu welchen Kosten? a und b sind Referenztypen und Vorschläge, die b
C # ist nicht F #.
Bitte sehen Sie sich meine vorherige SO Frage von Eric Lippert an:
"Zu meinen Faustregeln beim Schreiben von klarem Code gehören: Alle Nebenwirkungen in Anweisungen einfügen; Ausdrücke ohne Aussage sollten keine Nebenwirkungen haben. "
Tags und Links c# f# immutability extension-methods with-statement