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

另请参阅