Partilhar via


Células de referência

As células de referência são locais de armazenamento que permitem criar valores mutáveis com semântica de referência.

Sintaxe

ref expression

Observações

Use a ref função para criar uma nova célula de referência com um valor inicial. Em seguida, você pode alterar o valor subjacente porque ele é mutável. Uma célula de referência contém um valor real; não é apenas um endereço.

O exemplo de código a seguir ilustra a declaração e o uso de células de referência.

let xRef = ref 10

printfn "%d" xRef.Value

xRef.Value <- 11

printfn "%d" xRef.Value

A saída é a seguinte.

10
11

As células de referência são instâncias do tipo de registo genérico, que é declarado Ref da seguinte forma.

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

O tipo 'a ref é sinônimo de Ref<'a>. O compilador e o IntelliSense no IDE exibem o primeiro para esse tipo, mas a definição subjacente é a segunda.

O ref operador cria uma nova célula de referência. O código seguinte é a declaração do ref operador.

let ref x = { contents = x }

A tabela a seguir mostra os recursos disponíveis na célula de referência.

Operador, membro ou campo Description Tipo Definição
ref (operador) Encapsula um valor em uma nova célula de referência. 'a -> 'a ref let ref x = { contents = x }
Value (propriedade) Obtém ou define o valor subjacente. unit -> 'a member x.Value = x.contents

Os programadores de C# devem saber que em C# não é a mesma coisa ref que ref em F#. As construções equivalentes em F# são byrefs, que são um conceito diferente das células de referência.

Valores marcados como mutable podem ser promovidos automaticamente para 'a ref se capturados por um fechamento; consulte Valores.

Construções preteridas

Desde o F# 6.0, os seguintes operadores foram preteridos e seu uso fornece avisos informativos:

Operador, membro ou campo Description Tipo Definição
! (operador de desreferência, preterido) Devolve o valor subjacente. 'a ref -> 'a let (!) r = r.contents
:= (operador de atribuição, preterido) Altera o valor subjacente. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
contents (campo de registo) Obtém ou define o valor subjacente. 'a let ref x = { contents = x }

Em vez disso, o uso direto de .Value é preferível, veja F# RFC FS-1111.

O campo contents é fornecido para compatibilidade com outras versões do ML e produzirá um aviso durante a compilação. Para desativar o aviso, use a --mlcompatibility opção do compilador. Para obter mais informações, consulte Opções do compilador.

Consulte também