Dela via


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

Se även