c# - 重载 '+' 的不可变列表是否有意义?

标签 c# operator-overloading immutability

当然不会脱离.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;
}

更新

请参阅 Jon Skeet 关于要做什么的帖子 name methods on immutable lists .

令人惊讶的 react

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

最佳答案

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

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

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


阅读评论后,我的建议是使用 Concat()(以匹配框架中的 Enumerable.Concat)。我更喜欢的另一个选择是 Construct(),ala cons (虽然 cons 通常在前面),使用法非常清楚:

var list = BuildList(ImmutableList<int>.Empty);
var list2 = list.Concat(500); 
// Or: var list2 = list.Construct(500);

关于c# - 重载 '+' 的不可变列表是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3428667/

相关文章:

c# - 生成连续的字母数字 ID

c# - 来自预定义模板的多页 PDF 文档

c++ - 为 DiagonalMatrix 对象重载 operator()

compiler-errors - swift "Ambiguous use of operator ' = ='"

c# - RichTextBox 选择同一单词的多次出现

c++ - 仅针对二元运算符防止隐式转换运算符

java - 具有 const 参数的不可变对象(immutable对象)是否会被优化为仅由 Kotlin 编译器实例化一次

jpa - Lombok:公开不可变(over setters)对象,具有所有参数和无参数构造函数、散列、equals 和 toString

ruby - 如何测试 Ruby 对象是否不可变?

c# - 如何清除 CommandManager 注册的命令绑定(bind)?