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


Исправленная ключевое слово

Ключевое слово 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()

См. также