Freigeben über


Das Schlüsselwort „fixed“

Mit dem Schlüsselwort fixed können Sie eine lokale Variable an den Stapel „anheften“, um zu verhindern, dass sie während der Garbage Collection gesammelt oder verschoben wird. Es wird für untergeordnete Programmierszenarien verwendet.

Syntax

use ptr = fixed expression

Bemerkungen

Damit wird die Syntax von Ausdrücken so erweitert, dass ein Zeiger extrahiert und an einen Namen gebunden werden kann, der bei der Garbage Collection nicht gesammelt oder verschoben werden kann.

Ein Zeiger in einem Ausdruck wird über das Schlüsselwort fixed festgelegt und über das Schlüsselwort use an einen Bezeichner gebunden. Die Semantik ist ähnlich wie bei der Ressourcenverwaltung mit dem Schlüsselwort use. Der Zeiger ist fixiert, solange er sich im Bereich befindet, und sobald er sich außerhalb des Bereichs befindet, ist er nicht mehr fixiert. fixed kann nicht außerhalb des Kontexts einer use-Bindung verwendet werden. Sie müssen den Zeiger mit use an einen Namen binden.

Die Verwendung von fixed muss innerhalb eines Ausdrucks in einer Funktion oder Methode erfolgen. Das Schlüsselwort kann nicht auf Skriptebene oder im Bereich auf Modulebene verwendet werden.

Wie der gesamte Zeigercode ist dies ein unsicheres Feature, bei dessen Verwendung eine Warnung ausgegeben wird.

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