Teilen über


Das feste Schlüsselwort

Mit fixed dem Schlüsselwort können Sie ein lokales Element an den Stapel anheften, um zu verhindern, dass es während der Garbage Collection erfasst oder verschoben wird. Sie wird für Programmierszenarien auf niedriger Ebene verwendet.

Syntax

use ptr = fixed expression

Bemerkungen

Dadurch wird die Syntax von Ausdrücken erweitert, um das Extrahieren eines Zeigers und das Binden an einen Namen zu ermöglichen, der verhindert wird, dass er während der Garbage Collection erfasst oder verschoben wird.

Ein Zeiger aus einem Ausdruck wird über das fixed Schlüsselwort festgelegt und über das use Schlüsselwort an einen Bezeichner gebunden. Die Semantik dieser Daten ähnelt der Ressourcenverwaltung über das use Schlüsselwort. Der Zeiger ist fest, während er sich im Bereich befindet, und sobald er außerhalb des Gültigkeitsbereichs liegt, wird er nicht mehr behoben. fixed kann nicht außerhalb des Kontexts einer use Bindung verwendet werden. Sie müssen den Zeiger an einen Namen binden mit use.

Die Verwendung von fixed muss innerhalb eines Ausdrucks in einer Funktion oder einer Methode erfolgen. Sie kann nicht auf Skriptebene oder auf Modulebene verwendet werden.

Wie bei allen Zeigercode ist dies ein unsicheres Feature und gibt bei Verwendung eine Warnung aus.

Beispiel

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

Siehe auch