Condividi tramite


Celle di riferimento

Le celle di riferimento sono posizioni di archiviazione che consentono di creare valori modificabili con semantica di riferimento.

Sintassi

ref expression

Osservazioni:

Usare la ref funzione per creare una nuova cella di riferimento con un valore iniziale. È quindi possibile modificare il valore sottostante perché è modificabile. Una cella di riferimento contiene un valore effettivo; non è solo un indirizzo.

Nell'esempio di codice seguente viene illustrata la dichiarazione e l'uso di celle di riferimento.

let xRef = ref 10

printfn "%d" xRef.Value

xRef.Value <- 11

printfn "%d" xRef.Value

L'output è indicato di seguito.

10
11

Le celle di riferimento sono istanze del Ref tipo di record generico, dichiarato come segue.

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

Il tipo 'a ref è un sinonimo di Ref<'a>. Il compilatore e IntelliSense nell'IDE visualizzano il primo per questo tipo, ma la definizione sottostante è la seconda.

L'operatore ref crea una nuova cella di riferimento. Il codice seguente è la dichiarazione dell'operatore ref .

let ref x = { contents = x }

Nella tabella seguente vengono illustrate le funzionalità disponibili nella cella di riferimento.

Operatore, membro o campo Descrizione TIPO Definizione
ref (operatore) Incapsula un valore in una nuova cella di riferimento. 'a -> 'a ref let ref x = { contents = x }
Value (proprietà) Ottiene o imposta il valore sottostante. unit -> 'a member x.Value = x.contents

I programmatori C# devono sapere che ref in C# non è la stessa cosa di ref F#. I costrutti equivalenti in F# sono byrefs, che sono un concetto diverso dalle celle di riferimento.

I valori contrassegnati come mutable possono essere promossi automaticamente a 'a ref se acquisiti da una chiusura. Vedere Valori.

Costrutti deprecati

A partire da F# 6.0, gli operatori seguenti sono deprecati e il relativo uso genera avvisi informativi:

Operatore, membro o campo Descrizione TIPO Definizione
! (operatore dereference, deprecato) Restituisce il valore sottostante. 'a ref -> 'a let (!) r = r.contents
:= (operatore di assegnazione, deprecato) Modifica il valore sottostante. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
contents (campo record) Ottiene o imposta il valore sottostante. 'a let ref x = { contents = x }

Al contrario, l'uso diretto di .Value è preferibile. Vedere F# RFC FS-1111.

Il campo contents viene fornito per la compatibilità con altre versioni di ML e genererà un avviso durante la compilazione. Per disabilitare l'avviso, usare l'opzione del --mlcompatibility compilatore. Per altre informazioni, vedere opzioni del compilatore .

Vedere anche