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

ReturnCollectionasRead-Only分享

时间:2023-04-10 20:08:36 C#

ReturnCollectionasRead-Only我在多线程环境下有一个对象维护一组信息,例如:publicIListData{get{returndata;我目前有返回数据;由ReaderWriterLockSlim包装以保护集合免受共享违规。但是,更确切地说,我想将集合返回为只读,这样调用代码就无法对集合进行更改,只能查看已经存在的集合。这可能吗?如果您的唯一目的是使调用代码无错误,并且在修改集合时您应该只读取所有必要的是返回一个不支持添加、删除等的接口。为什么不返回IEnumerable?调用代码必须进行转换,如果他们不知道所访问的属性的内部结构,他们就不太可能这样做。但是,如果您的意图是防止调用代码观察来自其他线程的更新,则必须回退到已经提到的解决方案,以根据您的需要执行深拷贝或浅拷贝。如果基础数据存储为列表,则可以使用List(T).AsReadOnly方法。如果可以枚举数据,则可以使用Enumerable.ToList方法将集合转换为List并对其调用AsReadOnly。我投了你接受的答案并同意它-但我可以给你一些考虑吗?不要直接返回集合。创建一个准确命名的业务逻辑类以反映集合的目的。这样做的主要优点是您不能将代码添加到集合中,因此只要您的对象模型中有一个本机“集合”,您总是会在整个项目中散布非OO支持代码以访问它。例如,如果您的收款是发票,您的代码中可能有3或4个地方迭代未付发票。您可以使用getUnpaidInvoices方法。然而,当您开始考虑诸如“payUnpaidInvoices(payer,account);”之类的方法时,真正的力量就来了。当您传递集合而不是编写对象模型时,您将永远不必重构整个类。另请注意,这会使您的问题特别好。如果您不希望人们改变集合,则您的容器不需要包含修改器。如果您后来决定在某种情况下您实际上必须修改它,您可以创建一个安全机制来这样做。当你传递一个本地集合时,你如何解决这个问题?此外,无法使用额外数据增强本机集合。下次您发现自己将(Collection,Extra)传递给不止一种或两种方法时,您就会意识到这一点。它说“额外”属于包含您的收藏的对象。我认为你在这里混淆了概念。ReadOnlyCollection提供了现有集合的只读包装器,允许您(A类)将引用传递给安全的集合,因为调用者(B类)无法修改集合(即无法添加或删除集合中的任何元素)。)绝对没有线程安全保证。您的实施取决于您的需要:-如果您不关心调用者(B类)看到集合的任何进一步更改,那么您可以克隆集合,将其移出并停止关心。-如果您确实需要调用者(B类)查看对集合所做的更改,并且您希望它是线程安全的,那么您手上就会有更多问题。一种可能性是实现您自己的ReadOnlyCollection线程安全变体以允许锁定访问,但如果您想支持IEnumerable,那将是非常重要且效率不高的,并且它仍然无法保护您免受可变元素的影响。收藏。需要注意的是,aku的回答只是将列表保护为只读。列表的元素仍然非常可写。我不知道是否有任何方法可以保护非primefaces元素,而无需在将它们放入只读列表之前克隆它们。您可以使用该集合的副本。公共IList数据{获取{返回新列表(数据);}}这样,更新与否都没有关系。你想使用yield关键字。遍历IEnumerable列表并使用yeild返回结果。这允许消费者在不修改集合的情况下使用。看起来是这样的:以上是C#学习教程:以只读方式返回集合共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——List_Data;publicIEnumerableData{get{foreach(_Data中的字符串项){返回收益项;}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: