Bagikan melalui


Kata kunci tetap

Kata fixed kunci memungkinkan Anda untuk "menyematkan" lokal ke tumpukan untuk mencegahnya dikumpulkan atau dipindahkan selama pengumpulan sampah. Ini digunakan untuk skenario pemrograman tingkat rendah.

Sintaksis

use ptr = fixed expression

Komentar

Ini memperluas sintaks ekspresi untuk memungkinkan mengekstrak pointer dan mengikatnya ke nama yang dicegah dikumpulkan atau dipindahkan selama pengumpulan sampah.

Penunjuk dari ekspresi diperbaiki melalui fixed kata kunci dan terikat ke pengidentifikasi melalui use kata kunci. Semantik ini mirip dengan manajemen sumber daya melalui use kata kunci. Penunjuk diperbaiki saat berada dalam cakupan, dan setelah berada di luar cakupan, penunjuk tidak lagi diperbaiki. fixed tidak dapat digunakan di luar konteks use pengikatan. Anda harus mengikat penunjuk ke nama dengan use.

Penggunaan fixed harus terjadi dalam ekspresi dalam fungsi atau metode. Ini tidak dapat digunakan pada cakupan tingkat skrip atau tingkat modul.

Seperti semua kode pointer, ini adalah fitur yang tidak aman dan akan memancarkan 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()

Lihat juga