可能重复:
Why Option[T]?
引用类型提供特殊值null
,表示“缺少值”。值类型没有这样的值,这就是C#引入可选值类型(以及它们的特殊语法)的原因。
Scala的Option[T]
有三个不同的“空”值:null
,None
和Some(null)
。在安全性和可表达性方面,这增加了多少复杂性给我们带来了什么?我什么时候使用哪个?
答案 0 :(得分:5)
好的Scala实际上只有一个空值:None
。不要使用null
(除了与现有Java代码的向后兼容性)。
关于Option[T]
有用的原因,有很多答案。例如:请参阅this。
简短版本:
它使可选性质成为明确的签名。以下明确指出我们希望t
可能为“null”:
def f(t: Option[T])
您不必在操作前进行空值检查:(i: Option[Int]) => i.map(_ + 1)
无论i
是Some(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;
另一方面,有可选参数。您必须定义这些的默认值。没有办法知道他们是否失踪。