Het vaste trefwoord
Met fixed
het trefwoord kunt u een lokale locatie vastmaken aan de stack om te voorkomen dat deze wordt verzameld of verplaatst tijdens de garbagecollection. Het wordt gebruikt voor programmeerscenario's op laag niveau.
Syntaxis
use ptr = fixed expression
Opmerkingen
Hiermee wordt de syntaxis van expressies uitgebreid, zodat een aanwijzer kan worden geëxtraheerd en gekoppeld aan een naam die wordt voorkomen dat deze wordt verzameld of verplaatst tijdens de garbagecollection.
Een aanwijzer van een expressie wordt opgelost via het fixed
trefwoord en is gebonden aan een id via het use
trefwoord. De semantiek hiervan is vergelijkbaar met resourcebeheer via het use
trefwoord. De aanwijzer is vast terwijl deze binnen het bereik valt en zodra deze buiten het bereik valt, is deze niet meer opgelost. fixed
kan niet worden gebruikt buiten de context van een use
binding. U moet de aanwijzer binden aan een naam met use
.
Het gebruik van fixed
moet plaatsvinden in een expressie in een functie of een methode. Het kan niet worden gebruikt voor een bereik op script- of moduleniveau.
Net als bij alle aanwijzercode is dit een onveilige functie en wordt er een waarschuwing verzonden wanneer deze wordt gebruikt.
Voorbeeld
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()