我很清楚option
的好处,但在这种情况下,我希望避免因性能原因而使用option
。 option
在类中包装一个类型,这对垃圾收集器来说意味着更多的工作 - 我想避免这种情况。
特别是在这种情况下,我有多个字段在相同的情况下都是Some
,但我不想将它们放在元组中,因为元组是类 - 并且会增加额外的压力在GC上。所以我最终访问field.Value
- 这违背了option
的目的。
因此,除非进行优化,否则我不知道导致option
类型被视为可能为null的引用,我只想使用null
。我有办法做到这一点吗?
编辑:为了扩展我正在做的事情,我正在制作一个bounding volume hierarchy,它实际上是一个二叉树,只在叶节点上有数据。我将它作为一个类实现而不是作为一个有区别的联合实现,因为保持项目不可变不是出于性能原因的选择,而受歧视的联合不能有mutable
成员,只有ref
s - - 再次,增加GC压力。
与函数式语言一样愚蠢,我可能最终将每个节点类型作为Node
父类型的继承。 Downcasting并不是最快的操作,但就XNA和WP7而言,几乎任何东西都比激怒GC更好。
答案 0 :(得分:2)
根据this MSDN documentation,如果您使用[<AllowNullLiteral>]
属性修饰类型,则可以调用Unchecked.defaultof<T>()
为您构建null。
这似乎是F#中做你想做的事情的唯一方法。否则,您可以编组另一种.net语言并从那里获取空值...但我猜这根本不是您想要的
答案 1 :(得分:1)
现在有值选项,可以为您提供两全其美的选择
[<StructuralEquality; StructuralComparison>]
[<Struct>]
type ValueOption<'T> =
| ValueNone
| ValueSome of 'T
无类包装,Option<'T>
的语法语义