强制F#类型的字段为空

强制F#类型的字段为空,f#,null,option,F#,Null,Option,我很清楚选项的好处,但在这种情况下,出于性能原因,我希望避免使用选项选项将一个类型包装到一个类中,这只意味着垃圾收集器需要做更多的工作——我想避免这种情况 特别是在本例中,我有多个字段,它们在相同的情况下都是Some,但我不想将它们放在元组中,因为元组也是类——这给GC带来了额外的压力。因此,我最终访问了field.Value——这违背了选项的目的 因此,除非有一个我不知道的优化导致选项类型被视为可能为null的引用,否则我只想使用null。我有办法做到吗 编辑:为了扩展我正在做的事情,我制作了

我很清楚
选项的好处,但在这种情况下,出于性能原因,我希望避免使用
选项<代码>选项
将一个类型包装到一个类中,这只意味着垃圾收集器需要做更多的工作——我想避免这种情况


特别是在本例中,我有多个字段,它们在相同的情况下都是
Some
,但我不想将它们放在元组中,因为元组也是类——这给GC带来了额外的压力。因此,我最终访问了
field.Value
——这违背了
选项的目的

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

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

尽管在函数式语言中很愚蠢,但我最终可能会将每个节点类型作为父类型的继承来完成。这并不是最快的操作,但就XNA和WP7而言,几乎任何事情都比激怒GC要好。

根据,如果您使用
[]
属性修饰您的类型,那么您可以调用
Unchecked.defaultof()
为您构建空值

这似乎是F#内部做你想做的事情的唯一方式。否则,您可以使用另一种.net语言并从中获取空值。。。但我猜这根本不是你想要的

现在有一些价值选择可以让你两全其美

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

键入valueoption您确定添加的GC压力在您的情况下确实很重要吗?@svick是的,不幸的是,它用于XNA游戏的碰撞检测——这意味着它最终可能会在WP7或Xbox 360上运行,这两款游戏都有一代GC。“并对GC施加了额外的压力。”-您测量过吗?@Mitch否,但我已经测量了在粒子系统中使用元组对GC的影响。即使在x64.NET4上,它也非常难看。切换到自定义结构元组会大大增加我可以模拟的粒子数。我不能完全理解您试图执行的操作,但除了null或选项类型之外,可能还有其他方法。也许您可以更详细地描述一下您的用例,我们也许可以找到第三种方法。这要求消费者类型也标记为
[]
,但我想这总比没有好。我的4个字段中有3个现在可以为null——左、右和父节点。实际上,我相信您误读了文档:在您自己的类型上使用
[]
,以允许null作为正确的值。使用
Unchecked.defaultof()
创建F类型的空值,这些F类型不是您自己的,或者不允许空值作为正确的值(这意味着您还需要执行类似
object.ReferenceEquals(x,null)
的操作,而不是
x=null
,以解决编译器检查问题)。@Stephen Yeah,原来我只需要取消选中
。defaultof
。这很酷。我的印象是struct DUs只能是一个案例。你知道这些东西的记忆表征是什么样的吗?它没有说。