在函数式语言中通常有一个 Maybe
monad 允许你在一个对象上链接多个调用并让整个表达式返回 None
/null
如果链的任何部分计算为空,而不是典型的 NullReferenceException
在一个对象可能为 null 的情况下,您将通过链接调用进入 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 中处理序列而不是单个元素,它给你留下了一个 Maybe<T>
而不是 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
,但另一方面,如果使用得当,它在很多情况下都非常方便。想法?
最佳答案
在一个对象上链接多个调用让我担心违反 Law of Demeter .因此,我怀疑此功能是否是个好主意,至少在解决您用作示例的特定问题方面是这样。
关于c# - 条件取消引用运算符在 C# 中会是一件好事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/558756/