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.