Dela via


Referensceller

Referensceller är lagringsplatser som gör att du kan skapa föränderliga värden med referenssemantik.

Syntax

ref expression

Kommentarer

Du använder ref funktionen för att skapa en ny referenscell med ett initialt värde. Du kan sedan ändra det underliggande värdet eftersom det är föränderligt. En referenscell innehåller ett faktiskt värde. det är inte bara en adress.

Följande kodexempel illustrerar deklarationen och användningen av referensceller.

let xRef = ref 10

printfn "%d" xRef.Value

xRef.Value <- 11

printfn "%d" xRef.Value

Utdata är följande.

10
11

Referensceller är instanser av den Ref generiska posttypen, som deklareras enligt följande.

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

Typen 'a ref är en synonym för Ref<'a>. Kompilatorn och IntelliSense i IDE visar det förra för den här typen, men den underliggande definitionen är den senare.

Operatorn ref skapar en ny referenscell. Följande kod är operatorns ref deklaration.

let ref x = { contents = x }

I följande tabell visas de funktioner som är tillgängliga i referenscellen.

Operator, medlem eller fält beskrivning Typ Definition
ref (operator) Kapslar in ett värde i en ny referenscell. 'a -> 'a ref let ref x = { contents = x }
Value (egenskap) Hämtar eller anger det underliggande värdet. unit -> 'a member x.Value = x.contents

C#-programmerare bör veta att ref I C# inte är samma sak som ref i F#. Motsvarande konstruktioner i F# är byrefs, som är ett annat begrepp än referensceller.

Värden som markerats som mutable kan höjas upp automatiskt till 'a ref om de fångas upp av en stängning. Se Värden.

Inaktuella konstruktioner

Eftersom F# 6.0 är följande operatorer inaktuella och deras användning ger informationsvarningar:

Operator, medlem eller fält beskrivning Typ Definition
! (avreferenceoperator, inaktuell) Returnerar det underliggande värdet. 'a ref -> 'a let (!) r = r.contents
:= (tilldelningsoperator, inaktuell) Ändrar det underliggande värdet. 'a ref -> 'a -> unit let (:=) r x = r.contents <- x
contents (postfält) Hämtar eller anger det underliggande värdet. 'a let ref x = { contents = x }

I stället föredras direkt användning av .Value . Se F# RFC FS-1111.

Fältet contents tillhandahålls för kompatibilitet med andra versioner av ML och skapar en varning under kompilering. Om du vill inaktivera varningen använder du kompilatoralternativet --mlcompatibility . Mer information finns i Kompilatoralternativ.

Se även