Delen via


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

Zie ook