在函数式语言中,通常有一个Maybe
monad,它允许您将多个调用链接到一个对象并让整个表达式返回None
/null
如果链的任何部分计算为空,而不是NullReferenceException
通过链接调用在 C# 中获得的典型对象可能为空。
这可以通过编写Maybe<T>
一些扩展方法来轻松实现,以允许使用查询理解在 C# 中进行类似行为,这在处理带有可选元素/属性的 XML 时非常有用,例如
var val = from foo in doc.Elements("foo").FirstOrDefault().ToMaybe()
from bar in foo.Attribute("bar").ToMaybe()
select bar.Value;
但是这种语法有点笨拙和不直观,因为人们习惯于在 Linq 中处理序列而不是单个元素,并且它在末尾留下了 aMaybe<T>
而不是 a 。T
条件取消引用运算符(例如..
)是否足够有用以使其成为语言?例如
var val = doc.Elements("foo").FirstOrDefault()..Attribute("bar")..Value;
有条件的取消引用将扩展为:
object val;
var foo = doc.Elements("foo").FirstOrDefault();
if (foo != null)
{
var bar = foo.Attribute("bar");
if (bar != null)
{
val = bar.Value;
}
else
{
val = null;
}
}
我可以看到这可能会导致可怕的滥用,例如..
在任何地方使用来避免 a NullReferenceException
,但另一方面,如果使用得当,它在很多情况下可能会非常方便。想法?