Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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()