Wertoptionen

Der ValueOption-Typ in F# wird verwendet, wenn die folgenden beiden Umstände vorliegen:

  1. Ein Szenario eignet sich für den Option-Typ in F#.
  2. Die Verwendung einer Struktur hat in Ihrem Szenario einen Leistungsvorteil.

Strukturen kommen nicht für alle leistungsabhängigen Szenarios infrage. Sie müssen die zusätzlichen Kosten für das Kopieren berücksichtigen, wenn Sie sie anstelle von Verweistypen verwenden. Große F#-Programme instanziieren jedoch in der Regel viele optionale Typen, die über die langsamsten Pfade verarbeitet werden, und in solchen Fällen können Strukturen häufig eine bessere Gesamtleistung über die Lebensdauer eines Programms erzielen.

Definition

Der ValueOption-Typ ist als strukturdiskriminierte Union definiert und ähnelt dem Typ für Verweisoptionen. Er wird folgendermaßen definiert:

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

ValueOption entspricht der strukturellen Gleichheit und dem Strukturvergleich. Der Hauptunterschied besteht darin, dass der kompilierte Name, der Typname und der Name mit gemischter Groß-/Kleinschreibung darauf hinweisen, dass es sich um einen Werttyp handelt.

Verwenden von ValueOption-Typen

ValueOption-Typen werden wie Option-Typen verwendet. ValueSome wird verwendet, um anzugeben, dass ein Wert vorhanden ist, und ValueNone wird verwendet, wenn kein Wert vorhanden ist:

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!"

Genau wie bei Options gilt die Benennungskonvention für Funktionen, die ValueOption zurückgeben, dass diese mit dem Präfix try versehen werden.

Eigenschaften und Methoden von ValueOption-Typen

Derzeit gibt es nur eine Eigenschaft für ValueOption-Typen: Value. Eine InvalidOperationException-Ausnahme wird ausgelöst, wenn beim Aufrufen dieser Eigenschaft kein Wert vorhanden ist.

ValueOption-Funktionen

Das ValueOption-Modul in FSharp.Core enthält die gleichen Funktionen wie das Option-Modul. Es gibt jedoch einige Namensunterschiede, z. B. defaultValueArg:

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

Sie verhält sich wie defaultArg im Option-Modul, verwendet jedoch stattdessen ValueOption.

Siehe auch