Поделиться через


Фиксированное ключевое слово

Ключевое fixed слово позволяет закрепить локальный элемент на стеке, чтобы предотвратить его сбор или перемещение во время сборки мусора. Он используется для сценариев программирования низкого уровня.

Синтаксис

use ptr = fixed expression

Замечания

Это расширяет синтаксис выражений, чтобы разрешить извлечение указателя и привязку его к имени, которое не позволяет собирать или перемещать во время сборки мусора.

Указатель из выражения фиксируется с помощью fixed ключевого слова и привязан к идентификатору через ключевое use слово. Семантика этого типа аналогична управлению ресурсами с помощью ключевого use слова. Указатель исправлен, пока он находится в области, и после выхода из области он больше не исправлен. fixed нельзя использовать вне контекста use привязки. Необходимо привязать указатель к имени use.

fixed Использование должно происходить в выражении в функции или методе. Его нельзя использовать в области уровня скрипта или модуля.

Как и весь код указателя, это небезопасная функция и при использовании выдает предупреждение.

Пример

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

См. также