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

関連項目