共用方式為


值選項

當以下兩種情況成立時,會使用 F# 中的 Value Option 類型:

  1. 情況適用於 F# Option
  2. 使用 struct 可以在您的情況中提供效能優勢。

並非所有效能敏感的情況都可以透過使用 struct 來「解決」。 在使用它們而不是參考類型時,您必須考慮複製的額外成本。 但是,大型 F# 程式通常會具現化許多流經最忙碌路徑的選用類型,在這種情況下,struct 通常會在程式的存留期內產生更佳的整體效能。

定義

Value Option 可定義為類似於參考選項類型的結構區分聯集。 其定義可以這樣想:

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

Value Option 符合結構相等和比較。 主要差異在於編譯的名稱、類型名稱和大小寫名稱全都指出它是一個值類型。

使用 Value Option

Value Option 的用法就像 Options 一樣。 ValueSome 用來表示值存在,而 ValueNone 會在值不存在時使用:

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

Options 一樣,傳回 ValueOption 的函式的命名慣例是在其前面加上 try

Value Option 屬性和方法

Value Option 目前有一個屬性:Value。 如果叫用此屬性時不存在任何值,則會引發 InvalidOperationException

Value Option 函式

FSharp.Core 中的 ValueOption 模組包含了與 Option 模組相等的功能。 名稱上有一些差異,例如 defaultValueArg

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

這個的作用就像在 Option 模組中的 defaultArg 一樣,但只是改在 Value Option 上運作而已。

另請參閱