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.

Weitere Informationen