Bagikan melalui


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

Lihat juga