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