fixed 关键字
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()