在F#咒语中,似乎有一种对null
、Nullable<T>
及其同类的本能回避。作为交换,我们应该使用选项类型。老实说,我看不出有什么区别。
None
。例如,除了Option<int>
之外,int
还允许int
拥有的所有值。null
。例如,Nullable<int>
a.k.a int?
除了允许null
之外,还允许int
可以拥有的所有值。有什么关系呢?用Nullable
和Option
、null
和None
替换一些词汇表,基本上是一样的。null
有什么好大惊小怪的?
发布于 2012-06-21 21:33:00
F#选项是通用的,您可以为任何类型的'T
创建Option<'T>
。
Nullable<T>
是一种非常奇怪的类型;您只能将它应用于结构,尽管Nullable
类型本身是一个结构,但它不能应用于自身。所以您不能创建Nullable<Nullable<int>>
,而可以创建Option<Option<int>>
。他们必须做一些框架魔术,以使这一工作为Nullable
。在任何情况下,这意味着对于Nullables来说,如果类型是类还是结构,您必须事先知道,如果它是类,则只需要使用null而不是Nullable。这是一个丑陋的、漏洞百出的抽象;它的主要值似乎与数据库互操作有关,因为我猜在数据库域中有‘in,或没有值’对象是常见的。
我认为,当涉及到null和Nullable
时,Nullable
框架只是一个丑陋的烂摊子。你可以争辩说,F#通过使用Option
“增加了混乱”,或者通过建议您避免使用null/Nullable
(除非是互操作绝对必要的情况),并将注意力集中在与Option
的清洁解决方案上,可以将您从混乱中拯救出来。您可以找到两种观点的人。
你可能也想看看
发布于 2012-06-21 22:14:14
因为每个.NET引用类型都可以具有这个额外的、毫无意义的值--不管它是否为空,存在的可能性以及您必须检查它的可能性--而且由于Nullable
使用null
表示"nothing“,所以我认为消除所有这些奇怪( F#做的)并要求”无“的可能性是很有意义的。Option<_>
就是这么做的。
发布于 2012-06-22 15:13:44
有什么关系呢?
F#允许您选择是否希望您的类型是option
类型,并且当您这样做时,鼓励您检查None
,并使None
的存在或不存在在该类型中显式显示。
C#强制每个引用类型都允许null
,并且不鼓励您检查null
。
因此,这仅仅是违约的区别。
使用Nullable和Option、null和None替换一些词汇表,基本上是一样的。为什么这么大惊小怪?
如SML、OCaml和Haskell等语言所示,删除null
可以从实际代码中删除大量运行时错误。在某种程度上,null
的最初创建者甚至将其描述为"十亿美元的错误“。
https://stackoverflow.com/questions/11146825
复制相似问题