在F#mantra中,似乎有一种内心的避免null,Nullable<T>以及它的同类.作为交换,我们应该使用选项类型.说实话,我并没有真正看到差异.
我对F#选项类型的理解是它允许您指定一个可以包含其任何正常值的类型,或者None.例如,除了之外,还Option<int>允许所有int可以拥有的值None.
我对C#可空类型的理解是它允许你指定一个可以包含任何正常值的类型,或者null.例如,Nullable<int>又名int?允许所有的值的int可具有,除了null.
有什么不同?用Nullable和Option,做一些词汇替换,null并且None,你基本上有相同的东西.有什么大惊小怪的null?
Bri*_*ian 20
F#选项是通用的,您可以Option<'T>为任何类型创建'T.
Nullable<T>是一种非常奇怪的类型; 你只能将它应用于结构体,虽然Nullable类型本身就是一个结构体,但它不能应用于它自身.所以你不能创造Nullable<Nullable<int>>,而你可以创造Option<Option<int>>.他们必须做一些框架魔术才能让它发挥作用Nullable.在任何情况下,这意味着对于Nullables,如果类型是类或结构,则必须知道先验,如果它是类,则需要使用null而不是Nullable.这是一个丑陋的漏洞抽象; 它的主要价值似乎是与数据库互操作,因为我认为在数据库域中处理"int或无值"对象是很常见的.
我的意见是,.Net框架只是一个丑陋的混乱,当涉及到null和Nullable.您可以通过拥有Option或者通过建议您避免使用null/Nullable(除非对于互操作绝对必要时除外)并且专注于使用Options的清洁解决方案来证明F#'增加了混乱' .你可以找到有这两种观点的人.
你可能也想看
因为每个.NET引用类型都可以拥有这个额外的,毫无意义的值 - 无论它是否为 null,可能存在并且你必须检查它 - 并且因为Nullable使用null它作为"什么都没有"的表示,我认为它会产生很多意识到消除所有那些奇怪的东西(F#所做的)并要求"没有"的可能性是明确的.Option<_>那样做.