可选引用类型
本文关键字:引用类型 | 更新日期: 2023-09-27 18:28:12
可能的重复项:
为什么选择选项[T]?
引用类型提供特殊值null
表示"缺少值"。值类型没有这样的值,这就是 C# 引入可选值类型(以及它们的特殊语法(的原因。
Scala 的Option[T]
有三个不同的"空"值:null
、None
和 Some(null)
。这种增加的复杂性究竟给我们带来了什么安全性和可表现性?我什么时候会使用哪个?
Good Scala 实际上只有一个空值:None
。 不要使用null
(与现有 Java 代码的向后兼容性除外(。
关于为什么Option[T]
有用,SO有很多答案。 例如:看到这个。
简短版本:
它使可选性质成为明确的签名。 以下内容明确指出,我们预计t
可能为"空":
def f(t: Option[T])
您不必在操作之前进行 null 检查:无论i
是Some(5)
还是None
,(i: Option[Int]) => i.map(_ + 1)
都可以正常工作,并保留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
在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;
另一方面,也有可选参数。您必须定义这些值的默认值。没有办法知道它们是否丢失了。