Megosztás a következőn keresztül:


Referenciacellák

A referenciacellák olyan tárolóhelyek, amelyek lehetővé teszik a referencia szemantikával rendelkező, mutable értékek létrehozását.

Syntax

ref expression

Megjegyzések

A függvény használatával ref létrehoz egy új referenciacellát egy kezdeti értékkel. Ezután módosíthatja a mögöttes értéket, mert az nem módosítható. A referenciacellák tényleges értéket tárolnak; ez nem csak egy cím.

Az alábbi példakód a referenciacellák deklarálását és használatát szemlélteti.

let xRef = ref 10

printfn "%d" xRef.Value

xRef.Value <- 11

printfn "%d" xRef.Value

A kimenet a következő.

10
11

A referenciacellák az Ref általános rekordtípus példányai, amelyeket a következőképpen deklarálunk.

type Ref<'a> =
    { mutable contents: 'a }

A típus 'a ref a szinonimája.Ref<'a> A fordító és az IntelliSense az IDE-ben az előbbit jeleníti meg ehhez a típushoz, de a mögöttes definíció az utóbbi.

Az ref operátor létrehoz egy új referenciacellát. Az alábbi kód az operátor deklarációja ref .

let ref x = { contents = x }

Az alábbi táblázat a referenciacellában elérhető funkciókat mutatja be.

Operátor, tag vagy mező Leírás Típus Definíció
ref (operátor) Egy érték beágyazása egy új referenciacellába. 'a -> 'a ref let ref x = { contents = x }
Value (tulajdonság) Lekéri vagy beállítja a mögöttes értéket. unit -> 'a member x.Value = x.contents

A C#-programozóknak tudniuk kell, hogy ref a C#-ban nem ugyanaz, mint ref az F#-ban. Az F# megfelelő szerkezetei byrefsek, amelyek eltérnek a referenciacelláktól.

A lezárás által rögzített mutable értékek automatikusan előléptethetők 'a ref , lásd: Értékek.

Elavult szerkezetek

Az F# 6.0 óta a következő operátorok elavultak, és használatuk tájékoztató figyelmeztetéseket ad:

Operátor, tag vagy mező Leírás Típus Definíció
! (elévülési operátor, elavult) A mögöttes értéket adja vissza. 'a ref -> 'a let (!) r = r.contents
:= (hozzárendelés-operátor, elavult) Módosítja a mögöttes értéket. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
contents (rekordmező) Lekéri vagy beállítja a mögöttes értéket. 'a let ref x = { contents = x }

Ehelyett előnyben részesítik a közvetlen használatot .Value ; lásd: F# RFC FS-1111.

A mező contents az ML más verzióival való kompatibilitás érdekében van megadva, és a fordítás során figyelmeztetést fog eredményezni. A figyelmeztetés letiltásához használja a --mlcompatibility fordítót. További információt a Fordító beállításai című témakörben talál.

Lásd még