Referenzzellen
Referenzzellen sind Speicherorte, mit denen Sie veränderbare Werte mit Referenzsemantik erstellen können.
Syntax
ref expression
Hinweise
Sie verwenden die Funktion ref
, um eine neue Referenzzelle mit einem Anfangswert zu erstellen. Anschließend können Sie den zugrunde liegenden Wert ändern, da er änderbar ist. Eine Referenzzelle enthält einen tatsächlichen Wert, sie ist nicht lediglich eine Adresse.
Im folgenden Codebeispiel werden die Deklaration und Verwendung von Referenzzellen veranschaulicht.
let xRef = ref 10
printfn "%d" xRef.Value
xRef.Value <- 11
printfn "%d" xRef.Value
Die Ausgabe lautet wie folgt.
10
11
Referenzzellen sind Instanzen des generischen Ref
-Datensatztyps, der wie folgt deklariert wird.
type Ref<'a> =
{ mutable contents: 'a }
Der Typ 'a ref
ist ein Synonym für Ref<'a>
. Der Compiler und IntelliSense in der IDE zeigen erstere Version für diesen Typ an, jedoch ist letztere Version die zugrunde liegende Definition.
Mit dem Operator ref
wird eine neue Referenzzelle erstellt. Der folgende Code ist die Deklaration des Operators ref
.
let ref x = { contents = x }
Die folgende Tabelle enthält die Funktionen, die für die Referenzzelle verfügbar sind.
Operator, Member oder Feld | Beschreibung | type | Definition |
---|---|---|---|
ref (Operator) |
Kapselt einen Wert in einer neuen Referenzzelle. | 'a -> 'a ref |
let ref x = { contents = x } |
Value (Eigenschaft) |
Ruft den zugrunde liegenden Wert ab oder legt diesen fest. | unit -> 'a |
member x.Value = x.contents |
C#-Programmierer sollten wissen, dass ref
in C# nicht dasselbe ist wie ref
in F#. Die entsprechenden Konstrukte in F# sind byrefs, die ein anderes Konzept als Referenzzellen darstellen.
Als mutable
markierte Werte können automatisch zu 'a ref
höher gestuft werden, wenn sie von einem Abschluss erfasst werden. Weitere Informationen finden Sie unter Werte.
Veraltete Konstrukte
Seit F# 6.0 sind die folgenden Operatoren veraltet und ihre Verwendung führt zu Informationswarnungen:
Operator, Member oder Feld | Beschreibung | type | Definition |
---|---|---|---|
! (Dereferenzierungsoperator, veraltet) |
Gibt den zugrunde liegenden Wert zurück. | 'a ref -> 'a |
let (!) r = r.contents |
:= (Zuweisungsoperator, veraltet) |
Ändert den zugrunde liegenden Wert. | 'a ref -> 'a -> unit |
let (:=) r x = r.contents <- x |
contents (Datensatzfeld) |
Ruft den zugrunde liegenden Wert ab oder legt diesen fest. | 'a |
let ref x = { contents = x } |
Stattdessen wird die direkte Verwendung von .Value
bevorzugt. Weitere Informationen finden Sie unter F# RFC FS-1111.
Das Feld contents
wird für die Kompatibilität mit anderen Versionen von ML bereitgestellt und gibt während der Kompilierung eine Warnung aus. Verwenden Sie die --mlcompatibility
-Compileroption, um die Warnung zu deaktivieren. Weitere Informationen finden Sie unter Compileroptionen.