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, in quanto è modificabile. Una cella di riferimento contiene un valore effettivo e non solo un indirizzo.

Nell'esempio di codice seguente vengono illustrati la dichiarazione e l'utilizzo 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 tipo di record generico Ref, dichiarato come indicato di seguito.

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

Il tipo 'a ref è sinonimo di Ref<'a>. Il primo viene visualizzato dal compilatore e da IntelliSense nell'interfaccia IDE per questo tipo, mentre il secondo rappresenta la definizione sottostante.

L'operatore ref consente di creare una nuova cella di riferimento. Il codice seguente rappresenta la dichiarazione dell'operatore ref.

let ref x = { contents = x }

Nella tabella seguente sono indicate 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 del 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 garantire compatibilità con altre versioni di ML e comporta la generazione di un avviso durante la compilazione. Per disabilitare l'avviso, utilizzare l'opzione del compilatore --mlcompatibility. Per altre informazioni, vedere Opzioni del compilatore.

Vedi anche