F#中的Null Vs选项

时间:2011-03-07 01:30:13

标签: f# types

我在理解F#中“null”和Option的共存时遇到了问题。在一本书中,我已经读过,在F#中,null值不是一个合适的值,因为这样F#消除了过多的空值检查。但它仍允许F#中的空初始化引用。换句话说,你可以拥有空值,但你没有武器来保护自己。为什么不用Options完全替换null。是因为.NET库或语言的兼容性问题还存在吗?如果是,你能给出一个例子,说明为什么它不能被Option替换?

1 个答案:

答案 0 :(得分:7)

F#尽可能避免使用null,但它存在于.NET生态系统中,因此无法完全避免它。在一个完美的世界中,没有null值,但你有时需要它们。

例如,您可能需要使用null作为参数调用.NET方法,并且可能需要检查.NET方法调用的结果是否为null

F#解决这个问题的方式是:

    处理来自.NET的类型时使用
  • Null (当您在.NET中声明类型的值或参数时,可以使用null作为该类型的值;您可以测试它是否等于null

  • 使用F#类型时需要
  • 选项,因为在F#中声明的类型值不能是null(并且编译器禁止使用null作为值这些类型)。

    在F#编程中,您也可以在使用.NET类型时使用选项(如果您可以控制其值的创建方式)。您永远不会创建null值,然后使用选项来保证您始终能够正确处理缺失值。

这是唯一的选择。如果您想在访问.NET API时隐式地查看所有类型作为选项,几乎所有方法都是这样的:

option<Control> GetNextChild(option<Form> form, option<Control> current);

...使用这样的API进行编程会非常痛苦。