Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Ключевое 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()