Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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()