Dela via


Värdealternativ

Värdealternativtypen i F# används när följande två omständigheter gäller:

  1. Ett scenario är lämpligt för ett F#-alternativ.
  2. Att använda en struct ger en prestandafördel i ditt scenario.

Alla prestandakänsliga scenarier är inte "lösta" med hjälp av structs. Du måste tänka på den extra kostnaden för kopiering när du använder dem i stället för referenstyper. Stora F#-program instansierar dock ofta många valfria typer som flödar genom heta sökvägar, och i sådana fall kan structs ofta ge bättre övergripande prestanda under programmets livslängd.

Definition

Värdealternativet definieras som en struct-diskriminerad union som liknar referensalternativtypen. Dess definition kan tänkas på detta sätt:

[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
    | ValueNone
    | ValueSome of 'T

Värdealternativet överensstämmer med strukturell likhet och jämförelse. Den största skillnaden är att det kompilerade namnet, typnamnet och skiftlägesnamnen alla anger att det är en värdetyp.

Använda värdealternativ

Värdealternativ används precis som Alternativ. ValueSome används för att ange att ett värde finns och ValueNone används när ett värde inte finns:

let tryParseDateTime (s: string) =
    match System.DateTime.TryParse(s) with
    | (true, dt) -> ValueSome dt
    | (false, _) -> ValueNone

let possibleDateString1 = "1990-12-25"
let possibleDateString2 = "This is not a date"

let result1 = tryParseDateTime possibleDateString1
let result2 = tryParseDateTime possibleDateString2

match (result1, result2) with
| ValueSome d1, ValueSome d2 -> printfn "Both are dates!"
| ValueSome d1, ValueNone -> printfn "Only the first is a date!"
| ValueNone, ValueSome d2 -> printfn "Only the second is a date!"
| ValueNone, ValueNone -> printfn "None of them are dates!"

Precis som med Alternativ är namngivningskonventionen för en funktion som returnerar ValueOption att prefixa den med try.

Egenskaper och metoder för värdealternativ

Det finns en egenskap för Värdealternativ just nu: Value. En InvalidOperationException utlöses om inget värde finns när den här egenskapen anropas.

Funktioner för värdealternativ

Modulen ValueOption i FSharp.Core innehåller motsvarande funktioner som modulen Option . Det finns några skillnader i namn, till exempel defaultValueArg:

val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T

Detta fungerar precis som defaultArg i modulen Option , men fungerar på ett värdealternativ i stället.

Se även