有条件的去引用运算符在C#中是一件好事吗?

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,但另一方面,如果使用得当,它可能在很多情况下非常方便.思考?

Bri*_*ian 1

对一个对象进行多次调用让我担心会违反德米特法则。因此,我怀疑此功能是否是一个好主意,至少在解决您用作示例的特定问题方面是如此。