不变的收藏品?

时间:2009-05-29 17:25:30

标签: c# .net immutability

我在我的应用程序中创建了大多数基本类型,不可变。但收藏品是否也应该是不可变的?对我来说,这似乎是一个巨大的开销,除非我遗漏了一些东西。

我在谈论集合以保存Point3值等,可以在不同时间添加它们。因此,如果集合中有1M值,并且您需要删除其中的1个值,则必须重新创建相同的集合,对吧?

10 个答案:

答案 0 :(得分:26)

答案 1 :(得分:15)

不可变的集合很棒,特别是如果你的应用程序已经利用了不可变类型或语义。

.NET刚发布了他们的第一个immutable collections,我建议你试试。

答案 2 :(得分:8)

我最喜欢的收藏技巧就是永远不会传递它们。如果它们只存在于单个对象中,那么使它们成为不可变的几乎是无关紧要的(只要你的包含对象不改变它们就不会改变它们)。

通常你的收藏代表什么,对吧?这是一系列狗或一组发票......

通常你可以用一组狗(Herd?neuter?)或一组发票(付费?)来做一些事情。几乎总有一些操作适用于整个对象列表 - 具有功能的操作超出单一invoice.pay()(例如,确保首先支付最重要的发票),没有围绕您的集合的类,实际上没有地方放置这些操作。

通常有一些与你的集合相关的变量是有意义的 - 再次没有包装器你总是把这些变量放在一些奇怪的不自然的位置。

起初看起来可能有些奇怪,但在你判断之前要尝试几次。

答案 3 :(得分:2)

如果你只是从开始或结束添加/删除你可能会作弊 - 但总的来说;是的:暗示您需要为每次更改创建一个新集合。

所以:你需要(有效地)改变集合吗?如果是这样,并给出它们的大小:我很想看看同步访问(而不是让它们正确地不可变)。查看lock(又名Monitor)。

答案 4 :(得分:2)

我同意Eric关于为问题选择合适工具的评论。当您的目标包括提供清晰的身份语义或使您的实现更易于在并行计算环境中使用时,不变性会增加价值。不可变性还可以通过允许优化(如缓存或透明代理)来帮助提高性能。

另一方面,不变性也会带来性能成本 - 尤其是当您使用“写时复制”模式来模拟“更改”时。

你必须决定 为什么 你希望你的实体/集合是不可变的 - 这将有助于决定是否这样做。

答案 5 :(得分:0)

查找表将构成一个体面的不可变集合。它不需要改变大小,你想要它是静态的,所以它很容易查找棘手的计算。如果你以后需要添加一些东西,那么我就不会为了不变性而烦恼,它会破坏目的。

答案 6 :(得分:0)

这取决于您的程序的编写/设计风格。

不可变集合只有在以函数式编程影响的方式编程时才有意义(命令设计的程序不应该使用它们)。

就像在函数式语言中一样,你应该使用链接列表,然后可以在每个元素(cons)的O(1)中构建它们并在功能上处理它们(递归,从列表构建新列表)。

当你的程序需要命令式集合(数组,向量/列表)时,保持它们是可变的。

答案 7 :(得分:0)

您可以将公共接口定义为IEnumerable,但仍在实现中使用可变集合。

答案 8 :(得分:-1)

这一切都取决于谁同时使用这些收藏品。字符串是不可变的,以防止boo-boo像两个线程试图同时删除第一个字符。

答案 9 :(得分:-2)

如果你有一个集合,你可以在构建它之后添加项目,它不是不可变的