Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de changer d’annuaire.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer d’annuaire.
Le fixed mot clé vous permet d’épingler un élément 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
Remarques
Cela étend la syntaxe des expressions pour permettre l’extraction d’un pointeur et sa liaison à un nom qui est empêché d’être collecté ou déplacé pendant le garbage-collection.
Un pointeur d’une expression est résolu via le fixed mot clé et est lié à un identificateur via le use mot clé. La sémantique de ce problème est similaire à la gestion des ressources via le use mot clé. 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 use liaison. 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. Elle ne peut pas être utilisée au niveau du script ou au niveau du module.
Comme tout le code du pointeur, il s’agit d’une fonctionnalité non sécurisée et émet un avertissement lorsqu’il est utilisé.
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()