Condividi tramite


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

Vedi anche