Partager via


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

Remarques

Vous utilisez la ref fonction 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 ; ce n’est pas seulement 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 Ref type d’enregistrement générique, qui est déclaré comme suit.

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

Le type 'a ref est un synonyme de Ref<'a>. Le compilateur et IntelliSense dans l’IDE affichent l’ancien pour ce type, mais la définition sous-jacente est la dernière.

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 présente les fonctionnalités disponibles sur la cellule de référence.

Opérateur, membre ou champ Descriptif Catégorie 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 qu’en ref C# n’est pas la même chose que ref dans F#. Les constructions équivalentes en F# sont des parrefs, qui sont un concept différent des cellules de référence.

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

Constructions déconseillées

Étant donné que F# 6.0, les opérateurs suivants sont déconseillés et leur utilisation fournit des avertissements d’information :

Opérateur, membre ou champ Descriptif Catégorie Définition
! (opérateur de déréférencement, déconseillé) Retourne la valeur sous-jacente. 'a ref -> 'a let (!) r = r.contents
:= (opérateur d’affectation, déconseillé) 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 est .Value préférée ; voir F# RFC FS-1111.

Le champ contents est fourni pour la compatibilité avec d’autres versions de ML et génère un avertissement lors de la compilation. Pour désactiver l’avertissement, utilisez l’option du --mlcompatibility compilateur. Pour plus d’informations, consultez l’article Options du compilateur.

Voir aussi