Partilhar via


Opções de valor

O tipo Value Option em F# é usado quando as duas circunstâncias a seguir se mantêm:

  1. Um cenário é apropriado para uma opção F#.
  2. O uso de um struct fornece um benefício de desempenho em seu cenário.

Nem todos os cenários sensíveis ao desempenho são "resolvidos" usando structs. Você deve considerar o custo adicional da cópia ao usá-los em vez de tipos de referência. No entanto, grandes programas F# geralmente instanciam muitos tipos opcionais que fluem através de caminhos quentes e, nesses casos, as estruturas geralmente podem produzir um melhor desempenho geral ao longo da vida útil de um programa.

Definição

Value Option é definida como uma união discriminada struct que é semelhante ao tipo de opção de referência. A sua definição pode ser pensada desta forma:

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

A Opção de Valor está em conformidade com a igualdade estrutural e a comparação. A principal diferença é que o nome compilado, o nome do tipo e os nomes dos casos indicam que é um tipo de valor.

Usando opções de valor

As Opções de Valor são usadas da mesma forma que as Opções. ValueSome é usado para indicar que um valor está presente e ValueNone é usado quando um valor não está presente:

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

Assim como em Opções, a convenção de nomenclatura para uma função que retorna ValueOption é prefixá-la com try.

Propriedades e métodos da opção de valor

Há uma propriedade para Opções de Valor no momento: Value. Um InvalidOperationException é gerado se nenhum valor estiver presente quando essa propriedade for invocada.

Funções de opção de valor

O ValueOption módulo em FSharp.Core contém funcionalidade equivalente ao Option módulo. Existem algumas diferenças no nome, tais como defaultValueArg:

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

Isso age como defaultArg no Option módulo, mas opera em uma opção de valor.

Consulte também