c# - 条件取消引用运算符在 C# 中会是一件好事吗?

标签 c# language-features

在函数式语言中通常有一个 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/

相关文章:

c# - 如何独立运行 nunit 测试

c# - 为什么 GetEntryAssembly 返回 null?

Python 特性

c# - .NET 的 future 版本是否支持 C# 中的元组?

c# - 将 DataTable 转换为通用列表

c# - 声明比角色更好吗

c# - 更新对象中传递的所有字段而不使用替换

java - 我可以确定谁在调用 Java 中的函数或实例化类吗?

android - 您如何在 kivy 应用程序中使用语言选项

c# - 如何处理返回结构的不变性?