Erstens erkenne ich die Möglichkeit an, dass diese Frage ein Duplikat sein könnte; Lass es mich wissen.
Ich bin gespannt, was die allgemeine "Best Practice" für Situationen ist, in denen Veränderlichkeit gewünscht wird. F # scheint hierfür zwei Möglichkeiten zu bieten: die let mutable
Bindung, die in "den meisten" Sprachen wie Variablen zu funktionieren scheint, und die Referenzzelle (mit der ref
Funktion erstellt), für deren Verwendung eine explizite Dereferenzierung erforderlich ist.
Es gibt einige Fälle, in denen einer in den einen oder anderen "gezwungen" wird: .NET Interop verwendet in der Regel veränderlich mit <-
, und in Workflow-Berechnungen muss ref
mit verwendet werden :=
. Diese Fälle sind also ziemlich eindeutig, aber ich bin gespannt, was ich tun soll, wenn ich meine eigenen veränderlichen Variablen außerhalb dieser Szenarien erstelle. Welchen Vorteil hat ein Stil gegenüber dem anderen? (Vielleicht würde ein weiterer Einblick in die Implementierung helfen.)
Vielen Dank!
Antworten:
Ich kann nur unterstützen, was gradbot gesagt hat - wenn ich eine Mutation brauche, bevorzuge ich
let mutable
.In Bezug auf die Implementierung und Unterschiede zwischen den beiden
ref
Zellen werden im Wesentlichen durch einen sehr einfachen Datensatz implementiert, der ein veränderbares Datensatzfeld enthält. Sie können sie leicht selbst schreiben:Ein bemerkenswerter Unterschied zwischen den beiden Ansätzen besteht darin, dass
let mutable
der veränderbare Wert auf dem Stapel gespeichert wird (als veränderbare Variable in C #), währendref
der veränderbare Wert in einem Feld eines Heap-zugewiesenen Datensatzes gespeichert wird. Dies kann sich auf die Leistung auswirken, aber ich habe keine Zahlen ...Dank dessen können veränderbare Werte, die
ref
verwendet werden, als Alias verwendet werden. Dies bedeutet, dass Sie zwei Werte erstellen können, die auf denselben veränderlichen Wert verweisen:quelle
Verwandte Frage: "Sie haben erwähnt, dass lokale veränderbare Werte nicht von einem Abschluss erfasst werden können. Daher müssen Sie stattdessen ref verwenden. Der Grund dafür ist, dass veränderbare Werte, die im Abschluss erfasst wurden, auf dem Heap zugewiesen werden müssen (da der Abschluss am zugewiesen ist der Haufen). " von F # ref-veränderlichen vars vs Objektfeldern
Meiner Ansicht nach
let mutable
wird gegenüber Referenzzellen bevorzugt. Ich persönlich benutze Referenzzellen nur, wenn sie benötigt werden.Der meiste Code, den ich schreibe, verwendet dank Rekursion und Tail-Aufrufen keine veränderlichen Variablen. Wenn ich eine Gruppe veränderbarer Daten habe, verwende ich einen Datensatz. Für Objekte verwende ich
let mutable
private veränderbare Variablen. Ich benutze Referenzzellen nur für Schließungen, im Allgemeinen für Ereignisse.quelle
Wie in diesem MSDN-Blog-Artikel im Abschnitt Vereinfachte Verwendung veränderlicher Werte beschrieben , benötigen Sie keine Ref-Zellen mehr für Lambdas. Im Allgemeinen brauchen Sie sie also überhaupt nicht mehr.
quelle
Dieser Artikel von Brian könnte eine Antwort geben.
Mutables sind einfach zu verwenden und effizient (keine Verpackung), können jedoch nicht in Lambdas erfasst werden. Ref-Zellen können erfasst werden, sind jedoch ausführlich und weniger effizient (? - nicht sicher).
quelle
Vielleicht möchten Sie einen Blick auf den Abschnitt Mutable Data im Wikibook werfen.
Der Einfachheit halber sind hier einige relevante Zitate:
quelle