Parola chiave fixed
La fixed
parola chiave consente di "aggiungere" un'istanza locale nello stack per impedirne la raccolta o lo spostamento durante la Garbage Collection. Viene usato per scenari di programmazione di basso livello.
Sintassi
use ptr = fixed expression
Osservazioni:
In questo modo si estende la sintassi delle espressioni per consentire l'estrazione di un puntatore e l'associazione a un nome che non può essere raccolto o spostato durante l'operazione di Garbage Collection.
Un puntatore di un'espressione viene corretto tramite la fixed
parola chiave ed è associato a un identificatore tramite la use
parola chiave . La semantica di questo comportamento è simile alla gestione delle risorse tramite la use
parola chiave . Il puntatore è fisso mentre è nell'ambito e, una volta fuori ambito, non è più fisso. fixed
non può essere utilizzato all'esterno del contesto di un'associazione use
. È necessario associare il puntatore a un nome con use
.
L'uso di deve essere eseguito all'interno di fixed
un'espressione in una funzione o in un metodo. Non può essere usato a livello di script o a livello di modulo.
Come tutto il codice del puntatore, si tratta di una funzionalità non sicura e genererà un avviso quando viene usato.
Esempio
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()