选项类型和可空类型之间有什么区别?

时间:2012-06-21 21:11:24

标签: f# null

在F#咒语中,似乎有nullNullable<T>及其同类的内心回避。作为交换,我们应该使用选项类型。说实话,我并没有真正看到差异。

  • 我对F#选项类型的理解是,它允许您指定可以包含其任何正常值的类型,或None。例如,除了Option<int>之外,int还允许None可以拥有的所有值。

  • 我对C#可空类型的理解是,它允许您指定可以包含其任何正常值的类型,或null。例如,除了Nullable<int>之外,int? a.k.a int允许null可以拥有的所有值。

有什么区别?用NullableOptionnullNone替换一些词汇,你基本上也有同样的东西。 null关于{{1}}的大概是什么?

6 个答案:

答案 0 :(得分:20)

F#选项是常规选项,您可以为任何类型Option<'T>创建'T

Nullable<T>是一种非常奇怪的类型;你只能将它应用于结构体,虽然Nullable类型本身就是一个结构体,但它不能应用于它自身。因此,您无法创建Nullable<Nullable<int>>,而您可以创建Option<Option<int>>。他们必须做一些框架魔术才能使Nullable工作。在任何情况下,这意味着对于Nullables,如果类型是类或结构,则必须知道先验,如果它是类,则需要使用null而不是Nullable。这是一个丑陋的漏洞抽象;它的主要价值似乎是与数据库互操作,因为我认为在数据库域中处理“int或无值”对象是很常见的。

我的意见是,当涉及到null和Nullable时,.Net框架只是一个丑陋的混乱。您可以通过Option来争论F#'加入混乱',或者通过建议您避免使用null / Nullable(除非绝对必要< / em> for interop)并专注于使用Option s的干净解决方案。你可以找到有这两种观点的人。

您可能还想看

Best explanation for languages without null

答案 1 :(得分:6)

因为每个.NET引用类型都可以具有这个额外的,无意义的值 - 无论它是否 为null,因此存在这种可能性,您必须检查它 - 并且因为Nullable使用null作为“没有”的表示,我认为消除所有那些奇怪的东西(F#所做的)并且要求“没有”显而易见的可能性是很有意义的。 Option<_>就是这么做的。

答案 2 :(得分:6)

  

有什么区别?

F#可让您选择是否希望自己的类型为option类型,当您这样做时,鼓励您检查None并确认是否存在None在类型中显式。

C#强制每个引用类型都允许null,并且不鼓励您检查null

所以它只是默认值的差异。

  

用Nullable和Option做一些词汇替换,null和None,你基本上有相同的东西。什么是关于null的大惊小怪?

正如SML,OCaml和Haskell等语言所示,删除null会从实际代码中删除大量运行时错误。如果null的原始创作者甚至将其描述为“billion dollar mistake”。

答案 3 :(得分:3)

使用option的好处是它明确表示变量不能包含任何值,而可空类型则隐含它。给定的定义如下:

string val = GetValue(object arg);

类型系统不会记录val是否可以为null,或者如果arg为null将会发生什么。这意味着需要在函数边界进行重复检查,以验证调用者和被调用者的假设。

除了模式匹配之外,还可以静态检查使用选项类型的代码以确保处理这两种情况,例如以下代码会产生警告:

let f (io: int option) = function
| Some i -> i

答案 4 :(得分:0)

嗯,一个区别是对于Nullable<T>,T只能是一个可以显着减少用例的结构。

另请务必阅读以下答案:https://stackoverflow.com/a/947869/288703

答案 5 :(得分:0)

如OP所述,使用 optional nullable 字词在语义上没有太大区别传达可选类型时的strong>。

当您要表达 non -可选类型时,内置null系统的问题就很明显。

在C#中, 所有引用类型都可以 null。因此,如果我们依靠内置的null来表示可选值,则 所有 引用类型都必须是可选的...开发人员是否打算使用它或不。开发人员无法指定 非可选 引用类型(直到C#8)。

因此,问题不在于null的语义上。问题是null被引用类型劫持。

作为C#开发人员,我希望我可以使用内置的null系统来表达可选性。这正是C#8使用 可空引用类型 的方式。