Исправленная ключевое слово
Ключевое слово 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()