Compartir vía


Palabra clave “fixed”

La palabra clave fixed permite "anclar" un elemento 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

Comentarios

Esto extiende la sintaxis de expresiones para permitir que se extraiga un puntero y enlazarlo a un nombre, cuya recolección o traslado se impiden durante la recolección de elementos no utilizados.

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

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

Como 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