强制F#类型的字段为空

时间:2012-01-03 01:36:27

标签: f# null option

我很清楚option的好处,但在这种情况下,我希望避免因性能原因而使用optionoption在类中包装一个类型,这对垃圾收集器来说意味着更多的工作 - 我想避免这种情况。

特别是在这种情况下,我有多个字段在相同的情况下都是Some,但我不想将它们放在元组中,因为元组是类 - 并且会增加额外的压力在GC上。所以我最终访问field.Value - 这违背了option的目的。

因此,除非进行优化,否则我不知道导致option类型被视为可能为null的引用,我只想使用null。我有办法做到这一点吗?

编辑:为了扩展我正在做的事情,我正在制作一个bounding volume hierarchy,它实际上是一个二叉树,只在叶节点上有数据。我将它作为一个类实现而不是作为一个有区别的联合实现,因为保持项目不可变不是出于性能原因的选择,而受歧视的联合不能有mutable成员,只有ref s - - 再次,增加GC压力。

与函数式语言一样愚蠢,我可能最终将每个节点类型作为Node父类型的继承。 Downcasting并不是最快的操作,但就XNA和WP7而言,几乎任何东西都比激怒GC更好。

2 个答案:

答案 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>的语法语义