Celdas de referencia

Las celdas de referencia son lugares de almacenamiento que le permiten crear valores mutables con semántica de referencia.

Sintaxis

ref expression

Comentarios

La función ref se usa para crear una nueva celda de referencia con un valor inicial. A continuación, se puede cambiar el valor subyacente, porque es mutable. Una celda de referencia contiene un valor real; no una mera dirección.

En el ejemplo de código siguiente se muestran la declaración y el uso de celdas de referencia.

let xRef = ref 10

printfn "%d" xRef.Value

xRef.Value <- 11

printfn "%d" xRef.Value

La salida es la siguiente.

10
11

Las celdas de referencia son instancias del tipo de registro genérico Ref, que se declara como sigue.

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

El tipo 'a ref es un sinónimo de Ref<'a>. Tanto el compilador como IntelliSense en el IDE, muestran el primero para este tipo, pero la definición subyacente es el segundo.

El operador ref crea una nueva celda de referencia. El código siguiente es la declaración del operador ref.

let ref x = { contents = x }

En la tabla siguiente se muestran las características que están disponibles en la celda de referencia.

Operador, miembro o campo Descripción Tipo Definición
ref (operador) Encapsula un valor en una nueva celda de referencia. 'a -> 'a ref let ref x = { contents = x }
Value (propiedad) Obtiene o establece el valor subyacente. unit -> 'a member x.Value = x.contents

Los programadores de C# deben saber que ref en C# no es lo mismo que ref en F#. Las construcciones equivalentes en F# son byrefs, que son un concepto diferente de las celdas de referencia.

Los valores marcados como mutable pueden ser automáticamente promovidos a 'a ref si los captura una clausura; consulte Valores.

Construcciones en desuso

Desde la F# 6.0, los operadores siguientes están en desuso y su uso proporciona advertencias informativas:

Operador, miembro o campo Descripción Tipo Definición
! (operador de desreferencia, en desuso) Devuelve el valor subyacente. 'a ref -> 'a let (!) r = r.contents
:= (operador de asignación, en desuso) Cambia el valor subyacente. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
contents (campo de registro) Obtiene o establece el valor subyacente. 'a let ref x = { contents = x }

En su lugar, se prefiere el uso directo de .Value; consulte F# RFC FS-1111.

El campo contents se proporciona por motivos de compatibilidad con otras versiones de ML y generará una advertencia durante la compilación. Para deshabilitar la advertencia, utilice la opción --mlcompatibility del compilador. Para obtener más información, consulte Opciones del compilador.

Vea también