Compartilhar via


Opções de valor

O tipo de Opção de Valor 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 oferece 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 de copiar ao usá-los em vez de tipos de referência. No entanto, grandes programas F# geralmente instanciam muitos tipos opcionais que fluem por caminhos quentes e, nesses casos, structs geralmente podem produzir melhor desempenho geral ao longo do tempo de vida de um programa.

Definição

A opção Value é definida como uma união discriminada por struct semelhante ao tipo de opção de referência. Sua definição pode ser pensada dessa forma:

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

A opção Value 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 de maiúsculas e minúsculas indicam que ele é um tipo de valor.

Usando opções de valor

As Opções de Valor são usadas exatamente como 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 acontece com 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

No momento, há uma propriedade para Opções de Valor: Value. Um InvalidOperationException será 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. Há algumas diferenças no nome, como defaultValueArg:

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

Isso funciona exatamente como defaultArg no Option módulo, mas opera em uma Opção de Valor.

Consulte também