当前位置: 首页 > 编程语言 > C#

不可变集合?分享

时间:2023-04-10 11:43:11 C#

不变的收藏?我在我的应用程序中创建了最原始的类型,不可变的。但是集合也应该是不可变的吗?对我来说似乎是一个巨大的开销,除非我遗漏了什么。我说的是集合来保存可以在不同时间添加的Point3值等。所以如果你在一个集合中有1M个值,你需要删除其中的1个,你必须重新创建同一个集合,对吧?EricLippert有一系列关于C#中的不可变性的文章,如果你一直读下去,他实现了几个不同的不可变集合:C#中的不可变性第1部分:各种不可变性C#中的不可变性第1部分第2部分:C#中的不可变性与一个简单的不可变stack第3部分:使用协变不可变堆栈的C#中的不可变性第4部分:使用不可变队列的C#中的不可变性第5部分:哈哈!C#中的不可变性第6部分:一个简单的二叉树C#中的不可变性第7部分:更多关于二叉树的信息C#中的不可变性第8部分:更多关于C#中的二叉树不可变性第IX部分:学术?再加上我在C#中实现不变性的AVL树第10部分:C#中的双端队列不可变性第11部分:工作双端队列不可变集合非常棒,特别是如果您的应用程序已经利用了不可变类型或语义。.NET刚刚发布了他们的第一个不可变集合,我建议您尝试一下。我最喜欢的收藏技巧是永远不要传递它们。如果它们仅存在于单个对象中,那么使它们不可变几乎无关紧要(只要您的包含对象不更改它们就不会更改它们)。你的收藏通常代表什么?这是一系列的狗或一系列的发票......通常你可以用一群狗(牛群?中性?)或一组发票(付费?)来做某事。几乎总是有适用于整个对象列表的操作-操作invoice.pay()具有超出单数的功能(例如,确保首先支付最重要的发票),您的集合周围没有类,您实际上把那些操作放在位置上。将一些变量与您的集合相关联通常也是有意义的-同样,如果没有包装器,您总是将这些变量放在一些奇怪的不自然的地方。一开始可能看起来很奇怪,但在你判断之前尝试几次。我同意埃里克关于为问题选择正确工具的评论。当您的目标包括提供清晰的身份语义或使您的实现更易于在并行计算环境中使用时,不变性会增加价值。不变性还可以通过允许缓存或透明代理等优化来帮助提高性能。另一方面,不变性也有性能成本——尤其是当您使用“写时复制”模式来模拟“更改”时。你必须决定为什么你希望你的实体/集合是不可变的——这将有助于决定是否这样做。如果您只是从开头或结尾添加/删除,您可能会作弊-但一般来说;yes:言外之意是需要为每一次变化创建一个新的集合。所以:你需要(有效地)改变集合吗?如果是这样,并且考虑到它们的大小:我很乐意看到同步访问(而不是使它们适当地不可变)。看看锁(又名监视器)。查找表将构成一个不错的不可变集合。它不需要改变大小,你希望它是静态的,这样很容易查找棘手的计算。如果您以后需要添加一些东西,那么我不会为不变性而烦恼,它违背了目的。这取决于您编写/设计程序的风格。不可变集合只有在以受函数式编程影响的风格进行编程时才有意义(命令式设计的程序不应使用它们)。就像在函数式语言中一样,您应该使用链表,然后您可以在O(1)每个元素(cons)中构建它们并按功能处理它们(递归地,从列表构建新列表)。当你的程序需要命令式集合(数组、向量/列表)时,让它们保持可变。您可以将公共接口定义为IEnumerable,并在实现中仍然使用可变集合。这完全取决于谁在同时使用这些集合。字符串是不可变的,以防止像两个线程同时尝试删除第一个字符串那样的嘘声。如果你有一个集合,你可以在构造它之后向它添加项,它不是不可变的上面是C#学习教程:不可变的集合项?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: