问题标签 [readonly-collection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - ReadOnlyCollection 或 IEnumerable 用于公开成员集合?
如果调用代码仅迭代集合,是否有任何理由将内部集合公开为 ReadOnlyCollection 而不是 IEnumerable?
正如我所看到的,IEnumerable 是 ReadOnlyCollection 接口的子集,它不允许用户修改集合。因此,如果 IEnumberable 接口足够了,那么它就是可以使用的接口。这是一种正确的推理方式还是我错过了什么?
谢谢/埃里克
c# - 来自 ReadOnlyCollection 的对象 []
我有一个通过反射调用最终得到的对象:
object readOnlyCollectionObject = propertyInfo.GetValue(someEntity, null);
我知道这个对象是一个通用的 ReadOnlycollection。它可能是ReadOnlyCollection<Cat>
,ReadOnlyCollection<Dog>
等。为了论证起见,让我们说它是ReadOnlyCollection<T>
.
即使 Dog 派生自一个对象,我也知道 aReadOnlyCollection<Dog>
不是派生自 a ReadOnlyCollection<object>
。所以即使我使用反射调用CopyTo方法我仍然需要知道ReadOnlyCollection的具体类型,这是我想要避免的。
我想知道如何将所有元素作为对象引用数组从 ReadOnlyCollection 中取出,而无需知道ReadOnlyCollection<T>
.
c# - 为什么 ReadOnlyCollection<> 不包含 FindAll()、FindFirst()、
根据 FxCop 的建议和我的个人倾向,我一直在鼓励我正在执教的团队尽可能地使用 ReadOnlyCollections。如果只是这样列表的收件人不能修改他们的内容。在他们的理论中,这是面包和黄油。问题是 List<> 接口更丰富地公开了各种有用的方法。他们为什么做出这样的选择?
您是否只是放弃并返回可写集合?您是否返回只读集合,然后将它们包装在可写品种中?啊啊啊。
更新:谢谢我熟悉框架设计指南,这就是团队使用 FxCop 来执行它的原因。然而,这个团队正在使用 VS 2005(我知道,我知道),所以告诉他们 LINQ/Extension 方法可以解决他们的问题,这让他们很难过。
他们了解到 List.FindAll() 和 .FindFirst() 比编写 foreach 循环更清晰。现在我正在推动他们使用 ReadOnlyCollections 他们失去了这种清晰度。
也许有一个我没有发现的更深层次的设计问题。
-- 对不起,原帖应该提到了 VS2005 的限制。我住了这么久,我只是没有注意到。
c# - .NET 4.0 中的只读列表或不可修改列表
据我所知,.NET 4.0 仍然缺少只读列表。为什么框架仍然缺少这个功能?这不是领域驱动设计最常见的功能之一吗?
Java 相对于 C# 的少数优势之一是Collections.unmodifiablelist(list)方法的形式,它在 IList<T> 或 List<T> 中似乎早就应该使用了。
使用IEnumerable<T>
是该问题的最简单解决方案 -ToList
可以使用并返回副本。
c# - 如何防止方法调用者修改返回的集合?
我有将私有集合返回给调用者的方法,我想阻止调用者修改返回的集合。
目前私有集合是一个固定数组,但将来如果需要在运行时添加新项目,该集合可能会变成一个列表。
有几种解决方案可以防止调用者修改集合。返回IEnumerable<T>
是最简单的解决方案,但调用者仍然可以向上转换返回值IList<T>
并修改集合。
克隆集合具有明显的缺点,即有两个集合可以独立进化。到目前为止,我已经考虑了以下选项。
- 将集合包装在
ReadOnlyCollection<T>
. - 通过
Enumerable
执行虚拟投影(如list.Select(item => item)
. 实际上我考虑使用Where(item => true)
因为返回的迭代器看起来更轻量级。 - 编写自定义包装器。
我不喜欢使用ReadOnlyCollection<T>
的是它实现IList<T>
和调用Add()
或访问索引器会导致异常。虽然这在理论上是绝对正确的,但几乎没有真正的代码检查IList<T>.IsReadOnly
或IList<T>.IsFixedSize
.
使用 LINQ 迭代器 - 我将代码包装在扩展方法中MakeReadOnly()
- 可以防止这种情况,但它有一种 hack 的味道。
编写自定义包装器?重新发明轮子?
有什么想法、考虑或其他解决方案吗?
在标记这个问题时,我发现了这个我以前没有注意到的Stack Overflow 问题。Jon Skeet 也建议使用“LINQ hack”,但使用Skip(0)
.
.net - ReadOnlyCollection 有什么神奇之处吗
有这个代码...
我在第二行收到编译错误。我预计会出现运行时错误,因为ReadOnlyCollection<T>
实现IList<T>
并且接口中this[T]
有一个设置器IList<T>
。
我试图复制 ReadOnlyCollection 的功能,但从中删除 setterthis[T]
是一个编译错误。
vb.net - BindingSource / BindingNavigator:如何防止编辑绑定的DataSource?
我用 VB.NET 和 Visual Studio 2005 创建了一个数据源。我将数据源拖到我的对话框上,VS 用我的链接对象 aSystem.Windows.Forms.BindingSource
和 a的成员创建了文本框System.Windows.Forms.BindingNavigator
。
我填充了 List(称为 myList),将 myList 设置为 BindingSource 中的 DataSource,除了我希望它是只读的这一事实之外,一切都很顺利。如果用户在其中一个文本框中更改了某些内容,它会保存更改。
我尝试创建一个只读集合来绑定到 BindingSource,但这并没有解决问题:
我想我可以禁用所有的文本框,但这似乎有点笨拙,而且我可能想更改字体颜色以便更容易阅读。
理想情况下,我可能不在乎用户是否能够将焦点设置到文本框,甚至编辑内容,但我只是不希望任何更改持续存在。也就是说,如果有人编辑了某些东西,使用导航器转到下一条记录,然后返回,我希望它在用户使用它之前保持原样。
有什么建议/指导吗?
提前致谢!
automapper - AutoMapper 是否支持 ReadOnlyCollections?
我尝试了各种配置,但无法使其正常工作。我想知道它是否支持?
.net - 为什么 SortedList(TKey,TValue).Keys 属性是 IList(TKey) 而不是 ReadOnlyCollection(TKey)?
IList<T>
除了属性不支持的操作(SortedList<TKey, TValue>.Keys
例如Add
、Remove
和)之外,该接口还包括按索引访问Insert
。
A ReadOnlyCollection<T>
,例如 的返回值List<T>.AsReadOnly
,实现IList<T>
并因此提供按索引访问,但通过显式实现它们来隐藏非法操作Add
等。此外,它只是底层列表的包装器;所以它不会创建副本,因此(我会假设)不会对性能造成任何实际影响。
知道为什么SortedList<TKey, TValue.Keys
不是 aReadOnlyCollection<TKey>
吗?(就此而言,为什么该Values
属性不是ReadOnlyColllection<TValue>
?)
c# - 如何以无法更改返回的字典的方式为字典创建访问器 C#/2.0
我想到了下面的解决方案,因为集合非常小。但如果它很大呢?
使用列表,您可以:
那样就好了!
在此先感谢,干杯和BR-马蒂
现在,当我认为收藏中的对象在堆中时。所以我的解决方案不会阻止调用者修改它们!!!CAUSE BOTH Dictionary 都包含对相同对象的引用。这是否适用于上面的示例?
那么如何使这个不可变?