Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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 | Descrição | 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 | Descrição | 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.