避免空引用
C#开发人员得到了很多空引用异常来处理。F#开发人员没有,因为他们有 Option 类型。Option <>类型(有些人更喜欢 Maybe <>作为名称)提供 Some 和 None 返回类型。它明确表示方法可能即将返回空记录。
例如,你无法阅读以下内容并知道是否必须处理空值。
var user = _repository.GetUser(id);
如果你确实知道可能的 null,你可以引入一些样板代码来处理它。
var username = user != null ? user.Name : string.Empty;
如果我们返回了选项<>,该怎么办?
Option<User> maybeUser = _repository.GetUser(id);
代码现在明确表示我们可能返回了 None 记录,并且需要检查 Some 或 None 的样板代码:
var username = maybeUser.HasValue ? maybeUser.Value.Name : string.Empty;
以下方法显示如何返回 Option <>
public Option<User> GetUser(int id)
{
var users = new List<User>
{
new User { Id = 1, Name = "Joe Bloggs" },
new User { Id = 2, Name = "John Smith" }
};
var user = users.FirstOrDefault(user => user.Id == id);
return user != null ? new Option<User>(user) : new Option<User>();
}
这是 Option <>的最小实现。
public struct Option<T>
{
private readonly T _value;
public T Value
{
get
{
if (!HasValue)
throw new InvalidOperationException();
return _value;
}
}
public bool HasValue
{
get { return _value != null; }
}
public Option(T value)
{
_value = value;
}
public static implicit operator Option<T>(T value)
{
return new Option<T>(value);
}
}
为了演示上述,可以使用 C#REPL 运行 avoidNull.csx 。
如上所述,这是一个最小的实现。搜索 Maybe
NuGet 包将会出现一些好的库。