Partager via


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

Voir aussi