Compartir vía


Palabra clave fija

La fixed palabra clave permite "anclar" un local a la pila para evitar que se recopile o se mueva durante la recolección de elementos no utilizados. Se usa para escenarios de programación de bajo nivel.

Sintaxis

use ptr = fixed expression

Observaciones

Esto amplía la sintaxis de las expresiones para permitir extraer un puntero y enlazarlo a un nombre que se impide que se recopile o se mueva durante la recolección de elementos no utilizados.

Un puntero de una expresión se fija a través de la fixed palabra clave y se enlaza a un identificador a través de la use palabra clave . La semántica de esto es similar a la administración de recursos a través de la use palabra clave . El puntero se fija mientras está en el ámbito y, una vez que está fuera del ámbito, ya no se fija. fixed no se puede usar fuera del contexto de un use enlace. Debe enlazar el puntero a un nombre con use.

El uso de debe producirse dentro de fixed una expresión en una función o un método. No se puede usar en un ámbito de nivel de script o de módulo.

Al igual que todo el código de puntero, se trata de una característica no segura y emitirá una advertencia cuando se use.

Ejemplo

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()

Consulte también