Compartilhar via


Palavra-chave fixa

A palavra-chave fixed permite que você "fixe" um local na pilha para evitar que ele seja coletado ou movido durante a coleta de lixo. Ela é usada para cenários de programação de baixo nível.

Sintaxe

use ptr = fixed expression

Comentários

Isso estende a sintaxe das expressões para permitir extrair um ponteiro e associá-lo a um nome que é impedido de ser coletado ou movido durante a coleta de lixo.

Um ponteiro de uma expressão é fixado por meio da palavra-chave fixed e vinculado a um identificador por meio da palavra-chave use. A semântica disso é semelhante ao gerenciamento de recursos por meio da palavra-chave use. O ponteiro é fixo enquanto está no escopo e, uma vez fora do escopo, deixa de ser fixo. fixed não pode ser usada fora do contexto de uma use associação. Você deve associar o ponteiro a um nome com use.

O uso de fixed deve ocorrer em uma expressão em uma função ou método. Ela não pode ser usada em um escopo de nível de script ou de módulo.

Como todo código de ponteiro, esse é um recurso não seguro e emitirá um aviso quando usado.

Exemplo

open Microsoft.FSharp.NativeInterop

type Point = { mutable X: int; mutable Y: int}

let squareWithPointer (p: nativeptr<int>) =
    // Dereference the pointer at the 0th address.
    let mutable value = NativePtr.get p 0

    // Perform some work
    value <- value * value

    // Set the value in the pointer at the 0th address.
    NativePtr.set p 0 value

let pnt = { X = 1; Y = 2 }
printfn $"pnt before - X: %d{pnt.X} Y: %d{pnt.Y}" // prints 1 and 2

// Note that the use of 'fixed' is inside a function.
// You cannot fix a pointer at a script-level or module-level scope.
let doPointerWork() =
    use ptr = fixed &pnt.Y

    // Square the Y value
    squareWithPointer ptr
    printfn $"pnt after - X: %d{pnt.X} Y: %d{pnt.Y}" // prints 1 and 4

doPointerWork()

Confira também