Cellules de référence

Les cellules de référence sont des emplacements de stockage qui vous permettent de créer des valeurs mutables avec la sémantique de référence.

Syntaxe

ref expression

Notes

Vous utilisez la fonction ref pour créer une cellule de référence avec une valeur initiale. Vous pouvez ensuite modifier la valeur sous-jacente, car elle est mutable. Une cellule de référence contient une valeur réelle, et pas uniquement une adresse.

L'exemple de code suivant illustre la déclaration et l'utilisation de cellules de référence.

let xRef = ref 10

printfn "%d" xRef.Value

xRef.Value <- 11

printfn "%d" xRef.Value

La sortie est la suivante.

10
11

Les cellules de référence sont des instances du type d'enregistrement générique Ref qui est déclaré comme suit.

type Ref<'a> =
    { mutable contents: 'a }

Le type 'a ref (affiché par le compilateur et IntelliSense dans l'IDE) est un synonyme de Ref<'a> (définition sous-jacente).

L'opérateur ref crée une cellule de référence. Le code suivant est la déclaration de l'opérateur ref.

let ref x = { contents = x }

Le tableau suivant répertorie les fonctionnalités disponibles sur la cellule de référence.

Opérateur, membre ou champ Description Type Définition
ref (opérateur) Encapsule une valeur dans une nouvelle cellule de référence. 'a -> 'a ref let ref x = { contents = x }
Value (propriété) Obtient ou définit la valeur sous-jacente. unit -> 'a member x.Value = x.contents

Les programmeurs C# doivent savoir que ref en C# n’est pas la même chose que ref en F#. Les constructions équivalentes en F# sont byrefs, qui correspondent à un concept différent des cellules de référence.

Les valeurs marquées comme mutable peuvent être automatiquement promues en 'a ref si elles sont capturées par une fermeture ; consultez Valeurs.

Constructions dépréciées

Depuis F# 6.0, les opérateurs suivants sont dépréciés et leur utilisation donne des avertissements d’information :

Opérateur, membre ou champ Description Type Définition
! (opérateur de déréférencement, déprécié) Retourne la valeur sous-jacente. 'a ref -> 'a let (!) r = r.contents
:= (opérateur d’affectation, déprécié) Modifie la valeur sous-jacente. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
contents (champ d'enregistrement) Obtient ou définit la valeur sous-jacente. 'a let ref x = { contents = x }

Au lieu de cela, l’utilisation directe de .Value est recommandée ; consultez RFC F# FS-1111.

Le champ contents est fourni à des fins de compatibilité avec d'autres versions de ML et produit un avertissement au cours de la compilation. Pour désactiver l'avertissement, utilisez l'option de compilateur --mlcompatibility. Pour plus d’informations, consultez l’article Options du compilateur.

Voir aussi