Compartilhar via


Opções de valor

O tipo de opção de valor em F# é usado quando as duas circunstâncias a seguir são válidas:

  1. Um cenário é apropriado para uma Opção F#.
  2. O uso de uma estrutura 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 de copiar quando os utilizar em vez de tipos de referência. No entanto, grandes programas em F# geralmente instanciam muitos tipos opcionais que fluem através de caminhos críticos e, nesses casos, os structs geralmente podem gerar um desempenho geral melhor durante a vida útil de um programa.

Definição

A opção de valor é definida como uma união discriminada por estrutura que é semelhante ao tipo de opção de referência. Sua definição pode ser pensada dessa maneira:

[<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 de caso indicam que é 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 é gerado se nenhum valor estiver presente quando essa propriedade for invocada.

Funções de opção de valor

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

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

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

Confira também