Mot clé fixed
Le mot clé fixed
vous permet « d’épingler » un local sur la pile pour empêcher sa collecte ou son déplacement pendant le garbage-collection. Il est utilisé pour les scénarios de programmation de bas niveau.
Syntaxe
use ptr = fixed expression
Notes
Cela étend la syntaxe des expressions pour permettre d’extraire un pointeur et de le lier à un nom qui ne peut pas être collecté ou déplacé pendant le garbage collection.
Un pointeur d’une expression est résolu via le mot clé fixed
et est lié à un identificateur via le mot clé use
. La sémantique de ceci est similaire à la gestion des ressources via le mot clé use
. Le pointeur est fixe alors qu’il est dans l’étendue, et une fois qu’il est hors de portée, il n’est plus résolu. fixed
ne peut pas être utilisé en dehors du contexte d’une liaison use
. Vous devez lier le pointeur à un nom avec use
.
L’utilisation de fixed
doit se produire dans une expression dans une fonction ou une méthode. Il ne peut pas être utilisé au niveau d’un script ou au niveau d’un module.
Comme tout code de pointeur, il s’agit d’une fonctionnalité non sécurisée qui émet un avertissement lorsqu’elle est utilisée.
Exemple
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()