可选的引用类型

时间:2012-03-17 23:15:09

标签: c# scala null nullable option

  

可能重复:
  Why Option[T]?

引用类型提供特殊值null,表示“缺少值”。值类型没有这样的值,这就是C#引入可选值类型(以及它们的特殊语法)的原因。

Scala的Option[T]有三个不同的“空”值:nullNoneSome(null)。在安全性和可表达性方面,这增加了多少复杂性给我们带来了什么?我什么时候使用哪个?

2 个答案:

答案 0 :(得分:5)

好的Scala实际上只有一个空值:None。不要使用null(除了与现有Java代码的向后兼容性)。

关于Option[T]有用的原因,有很多答案。例如:请参阅this

简短版本:

它使可选性质成为明确的签名。以下明确指出我们希望t可能为“null”:

def f(t: Option[T]) 

您不必在操作前进行空值检查:(i: Option[Int]) => i.map(_ + 1)无论iSome(5)还是None保留,都可以正常工作Option包装器表示输入可能是None(因此,输出也可能是None。)

def f(i: Option[Int]) = i.map(_ + 1)
f(Some(5)) // Some(6)
f(None)    // None

您可以使用其他Option或集合轻松撰写它们:

val a: Option[Int] = Some(1)
val b: Option[Int] = Some(6)
val c: Option[Int] = Some(5)
val d: Option[Int] = None
for(x <- a; y <- b; z <- c) yield x + y + z // Some(12)
for(x <- a; y <- d; z <- c) yield x + y + z // None

答案 1 :(得分:1)

在C#中(通常在.NET Framework中)有类型Nullable<T>,它是一种值类型的包装器。

Nullable<int> i = null;
if (i == null) ...
if (i.HasValue) { int k = i.Value; ... }

Nullable<T>有一个快捷方式:T?

int? i = null;

另一方面,有可选参数。您必须定义这些的默认值。没有办法知道他们是否失踪。