代码之家  ›  专栏  ›  技术社区  ›  ChaosPandion

重载“+”的不可变列表是否有意义?

  •  2
  • ChaosPandion  · 技术社区  · 14 年前

    它当然不会违背.NET框架的标准实践。当我看到一个 a + b 我总是认为会创造出新的东西。

    static void Main(string[] args)
    {
        var list = BuildList(ImmutableList<int>.Empty);
        var sum = (list + 500).Sum();
        Console.WriteLine(sum);
        Console.ReadLine();
    }
    
    static ImmutableList<int> BuildList(ImmutableList<int> list)
    {
        if (list.Count < 1000)
        {
            return BuildList(list + list.Count);
        }
        return list;
    }
    

    更新

    看乔恩·斯基特的帖子 name methods on immutable lists .

    令人惊讶的反应

    我很惊讶地看到这么多的答案都同意这是有道理的。原则上我也同意这一点,但对于我来说,阅读冗长的代码要比不喜欢简洁的人更容易阅读简洁的代码。从我的工作经验来看,他们似乎占大多数。

    5 回复  |  直到 14 年前
        1
  •  6
  •   Reed Copsey    14 年前

    我个人不建议像 + 对于任何不被视为原始类的类。特别是,在我看来,集合永远不应该超载运算符。

    当您有一个小的不可变类或结构,它的行为类似于“基元”类型时,运算符重载是有意义的。但是,当您开始为其他类尝试这样做时,它确实会影响可维护性。

    我建议您改为进行显式方法调用。


    在阅读评论后,我的建议是使用 Concat() (比赛) Enumerable.Concat 在框架中)。我更喜欢的另一种选择是 Construct() 阿拉 cons (尽管cons通常是预先准备好的),为了使用法非常清楚:

    var list = BuildList(ImmutableList<int>.Empty);
    var list2 = list.Concat(500); 
    // Or: var list2 = list.Construct(500);
    
        2
  •  5
  •   Gabe Timothy Khouri    14 年前

    重载的不可变字符列表 + 有道理,我们称之为字符串。通过类比,您可以说,任何超载 + 调用的运算符 Concat 操作是有意义的。

    顺便说一句,我最近创建了一个类似于您描述的函数:

    public static IEnumerable<T> Append<T>(this IEnumerable<T> list, T item)
    {
        foreach (T i in list)
            yield return i;
        yield return item;
    }
    

    我决定 Append 向列表中添加单个元素,而 连接两个字符串 将整个列表添加到列表末尾。

        3
  •  2
  •   PeterL    14 年前

    什么? + 在这种情况下意味着什么?我似乎真的不清楚(没有阅读代码)。 IList + IList 我可以把它看作是一个联合操作符,或者组合列表(保留重复项)或者其他任何数量的东西。 IList + int 只是让我困惑。在我看来,与每次使用重载运算符时都必须查找的运算符或注释相比,具有清晰名称的方法可以使代码更易于阅读。

        4
  •  2
  •   Jon Hanna    14 年前

    关于运营商,有一点是人们希望他们相对高效。没什么好说的,但人们似乎确实希望这样。

    如果在内部,这样一个列表的结构允许您通过让它存储对其来源的两个引用来创建一个连接列表(非常可能,特别是考虑到不可变性会消除混淆副作用的风险),那么我就开始使用它。如果它可能需要做一个相对昂贵的操作,那么我不会这样做。“concatenate()”可能会让人考虑“我真的需要在我目前所处的这个紧循环中移动这么多内存吗,或者我应该在这种想法合适的时候考虑一种不同的方法”。

        5
  •  1
  •   Joshua    14 年前

    我会这么做的。

    毕竟,字符串是一个字符列表。

    是的,如果我看到了<list>+<list>我会立即想到concatenate(唯一的其他可能性是vector sum,这很少见)。