以下两种情况保留时,使用 F# 中的值选项类型:
- 方案适用于 F# 选项。
- 使用结构在方案中提供性能优势。
并非所有性能敏感的方案都是使用结构“解决的”。 使用它们而不是引用类型时,必须考虑复制的额外成本。 但是,大型 F# 程序通常实例化许多流经热路径的可选类型,在这种情况下,结构通常会在程序的生存期内产生更好的整体性能。
定义
值选项定义为类似于引用选项类型的 结构区分联合 。 其定义可以这样思考:
[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
| ValueNone
| ValueSome of 'T
值选项符合结构相等性和比较性。 主要区别在于,已编译的名称、类型名称和大小写名称都表示它是值类型。
使用值选项
值选项与 选项一样使用。
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。 如果在调用此属性时不存在任何值,则会引发一个 InvalidOperationException 值。
值选项函数
ValueOption FSharp.Core 中的模块包含与Option模块等效的功能。 名称存在一些差异,例如 defaultValueArg:
val defaultValueArg : arg:'T voption -> defaultValue:'T -> 'T
这就像在模块中Option一样defaultArg,而是对值选项进行作。