Kata kunci fixed
Kata kunci fixed
memungkinkan Anda "menyematkan" lokal ke tumpukan untuk mencegahnya dikumpulkan atau dipindahkan selama pengumpulan sampah. Kata kunci tersebut digunakan untuk skenario pemrograman tingkat rendah.
Sintaks
use ptr = fixed expression
Keterangan
Hal ini memperluas sintaks ekspresi untuk memungkinkan mengekstraksi pointer dan mengikatnya ke sebuah nama yang dicegah untuk dikumpulkan atau dipindahkan selama pengumpulan sampah.
Pointer dari ekspresi ditetapkan melalui kata kunci fixed
dan diikat ke pengidentifikasi melalui kata kunci use
. Semantiknya mirip dengan manajemen sumber daya melalui kata kunci use
. Pointer diperbaiki saat berada dalam cakupan, dan setelah berada di luar cakupan, pointer tidak lagi diperbaiki. fixed
tidak dapat digunakan di luas konteks pengikatan use
. Anda harus mengikat pointer ke sebuah nama dengan use
.
Penggunaan fixed
harus terjadi dalam sebuah ekspresi dalam fungsi atau metode. Kata kunci tersebut tidak dapat digunakan pada cakupan tingkat skrip atau tingkat modul.
Seperti semua kode pointer, ini adalah fitur yang tidak aman dan akan mengeluarkan peringatan saat digunakan.
Contoh
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()