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