Udostępnij za pośrednictwem


Stałe słowo kluczowe

Słowo fixed kluczowe umożliwia "przypięcie" lokalnego do stosu, aby zapobiec jego zebraniu lub przeniesieniu podczas odzyskiwania pamięci. Jest on używany w scenariuszach programowania niskiego poziomu.

Składnia

use ptr = fixed expression

Uwagi

Rozszerza to składnię wyrażeń, aby umożliwić wyodrębnienie wskaźnika i powiązanie go z nazwą, która nie może być zbierana lub przenoszona podczas odzyskiwania pamięci.

Wskaźnik z wyrażenia jest stały za pośrednictwem fixed słowa kluczowego i jest powiązany z identyfikatorem za pośrednictwem słowa kluczowego use . Semantyka tego elementu jest podobna do zarządzania zasobami za pośrednictwem słowa kluczowego use . Wskaźnik jest stały, gdy znajduje się w zakresie, a gdy jest poza zakresem, nie jest już stały. fixed nie można używać poza kontekstem use powiązania. Należy powiązać wskaźnik z nazwą o nazwie use.

fixed Użycie elementu musi wystąpić w wyrażeniu w funkcji lub metodzie. Nie można jej używać na poziomie skryptu ani w zakresie na poziomie modułu.

Podobnie jak cały kod wskaźnika, jest to niebezpieczna funkcja i będzie emitować ostrzeżenie w przypadku użycia.

Przykład

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

Zobacz też