Gre*_*ech 5 c# language-features
在函数式语言中,通常有一个Maybemonad,它允许你在一个对象上链接多个调用并让整个表达式返回None/ null如果链的任何部分评估为空,而不是典型的NullReferenceException你通过链接调用来获取C#对象可以为null.
这可以通过编写Maybe<T>一些扩展方法来实现,以允许使用查询理解在C#中进行类似的行为,这在使用可选元素/属性处理XML时非常有用,例如
var val = from foo in doc.Elements("foo").FirstOrDefault().ToMaybe()
from bar in foo.Attribute("bar").ToMaybe()
select bar.Value;
Run Code Online (Sandbox Code Playgroud)
但是这种语法有点笨拙且不直观,因为人们习惯于处理Linq中的序列而不是单个元素,并且它会给你留下一个Maybe<T>而不是T最后一个.有条件的去引用运算符(例如..)是否足以使其成为语言?例如
var val = doc.Elements("foo").FirstOrDefault()..Attribute("bar")..Value;
Run Code Online (Sandbox Code Playgroud)
条件去引用将扩展为:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以看到,这可能会导致可怕的滥用,例如..在任何地方使用以避免使用NullReferenceException,但另一方面,如果使用得当,它可能在很多情况下非常方便.思考?