Det fasta nyckelordet
Med nyckelordet fixed
kan du "fästa" en lokal på stacken för att förhindra att den samlas in eller flyttas under skräpinsamlingen. Den används för lågnivåprogrammeringsscenarier.
Syntax
use ptr = fixed expression
Kommentarer
Detta utökar syntaxen för uttryck så att du kan extrahera en pekare och binda den till ett namn som inte kan samlas in eller flyttas under skräpinsamlingen.
En pekare från ett uttryck korrigeras via nyckelordet fixed
och är bunden till en identifierare via nyckelordet use
. Semantiken i detta liknar resurshantering via nyckelordet use
. Pekaren är fast när den finns i omfånget och när den är utanför omfånget är den inte längre fast. fixed
kan inte användas utanför kontexten för en use
bindning. Du måste binda pekaren till ett namn med use
.
Användning av fixed
måste ske i ett uttryck i en funktion eller en metod. Den kan inte användas på skriptnivå eller modulnivå.
Precis som med all pekarkod är detta en osäker funktion och genererar en varning när den används.
Exempel
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()