问题标签 [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.

0 投票
5 回答
37040 浏览

c# - ReadOnlyCollection 或 IEnumerable 用于公开成员集合?

如果调用代码仅迭代集合,是否有任何理由将内部集合公开为 ReadOnlyCollection 而不是 IEnumerable?

正如我所看到的,IEnumerable 是 ReadOnlyCollection 接口的子集,它不允许用户修改集合。因此,如果 IEnumberable 接口足够了,那么它就是可以使用的接口。这是一种正确的推理方式还是我错过了什么?

谢谢/埃里克

0 投票
5 回答
3183 浏览

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>.

0 投票
4 回答
8424 浏览

c# - 为什么 ReadOnlyCollection<> 不包含 FindAll()、FindFirst()、

根据 FxCop 的建议和我的个人倾向,我一直在鼓励我正在执教的团队尽可能地使用 ReadOnlyCollections。如果只是这样列表的收件人不能修改他们的内容。在他们的理论中,这是面包和黄油。问题是 List<> 接口更丰富地公开了各种有用的方法。他们为什么做出这样的选择?

您是否只是放弃并返回可写集合?您是否返回只读集合,然后将它们包装在可写品种中?啊啊啊。


更新:谢谢我熟悉框架设计指南,这就是团队使用 FxCop 来执行它的原因。然而,这个团队正在使用 VS 2005(我知道,我知道),所以告诉他们 LINQ/Extension 方法可以解决他们的问题,这让他们很难过。

他们了解到 List.FindAll() 和 .FindFirst() 比编写 foreach 循环更清晰。现在我正在推动他们使用 ReadOnlyCollections 他们失去了这种清晰度。

也许有一个我没有发现的更深层次的设计问题。

-- 对不起,原帖应该提到了 VS2005 的限制。我住了这么久,我只是没有注意到。

0 投票
7 回答
50271 浏览

c# - .NET 4.0 中的只读列表或不可修改列表

据我所知,.NET 4.0 仍然缺少只读列表。为什么框架仍然缺少这个功能?这不是领域驱动设计最常见的功能之一吗?

Java 相对于 C# 的少数优势之一是Collections.unmodifiablelist(list)方法的形式,它在 IList<T> 或 List<T> 中似乎早就应该使用了。

使用IEnumerable<T>是该问题的最简单解决方案 -ToList可以使用并返回副本。

0 投票
4 回答
1535 浏览

c# - 如何防止方法调用者修改返回的集合?

我有将私有集合返回给调用者的方法,我想阻止调用者修改返回的集合。

目前私有集合是一个固定数组,但将来如果需要在运行时添加新项目,该集合可能会变成一个列表。

有几种解决方案可以防止调用者修改集合。返回IEnumerable<T>是最简单的解决方案,但调用者仍然可以向上转换返回值IList<T>并修改集合。

克隆集合具有明显的缺点,即有两个集合可以独立进化。到目前为止,我已经考虑了以下选项。

  1. 将集合包装在ReadOnlyCollection<T>.
  2. 通过Enumerable执行虚拟投影(如list.Select(item => item). 实际上我考虑使用Where(item => true)因为返回的迭代器看起来更轻量级。
  3. 编写自定义包装器。

我不喜欢使用ReadOnlyCollection<T>的是它实现IList<T>和调用Add()或访问索引器会导致异常。虽然这在理论上是绝对正确的,但几乎没有真正的代码检查IList<T>.IsReadOnlyIList<T>.IsFixedSize.

使用 LINQ 迭代器 - 我将代码包装在扩展方法中MakeReadOnly()- 可以防止这种情况,但它有一种 hack 的味道。

编写自定义包装器?重新发明轮子?

有什么想法、考虑或其他解决方案吗?


在标记这个问题时,我发现了这个我以前没有注意到的Stack Overflow 问题。Jon Skeet 也建议使用“LINQ hack”,但使用Skip(0).

0 投票
3 回答
908 浏览

.net - ReadOnlyCollection 有什么神奇之处吗

有这个代码...

我在第二行收到编译错误。我预计会出现运行时错误,因为ReadOnlyCollection<T>实现IList<T>并且接口中this[T]有一个设置器IList<T>

我试图复制 ReadOnlyCollection 的功能,但从中删除 setterthis[T]是一个编译错误。

0 投票
2 回答
2869 浏览

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,但这并没有解决问题:

我想我可以禁用所有的文本框,但这似乎有点笨拙,而且我可能想更改字体颜色以便更容易阅读。

理想情况下,我可能不在乎用户是否能够将焦点设置到文本框,甚至编辑内容,但我只是不希望任何更改持续存在。也就是说,如果有人编辑了某些东西,使用导航器转到下一条记录,然后返回,我希望它在用户使用它之前保持原样。

有什么建议/指导吗?

提前致谢!

0 投票
1 回答
291 浏览

automapper - AutoMapper 是否支持 ReadOnlyCollections?

我尝试了各种配置,但无法使其正常工作。我想知道它是否支持?

0 投票
1 回答
485 浏览

.net - 为什么 SortedList(TKey,TValue).Keys 属性是 IList(TKey) 而不是 ReadOnlyCollection(TKey)?

IList<T>除了属性不支持的操作(SortedList<TKey, TValue>.Keys例如AddRemove和)之外,该接口还包括按索引访问Insert

A ReadOnlyCollection<T>,例如 的返回值List<T>.AsReadOnly,实现IList<T>并因此提供按索引访问,但通过显式实现它们来隐藏非法操作Add等。此外,它只是底层列表的包装器;所以它不会创建副本,因此(我会假设)不会对性能造成任何实际影响。

知道为什么SortedList<TKey, TValue.Keys不是 aReadOnlyCollection<TKey>吗?(就此而言,为什么该Values属性不是ReadOnlyColllection<TValue>?)

0 投票
2 回答
1227 浏览

c# - 如何以无法更改返回的字典的方式为字典创建访问器 C#/2.0

我想到了下面的解决方案,因为集合非常小。但如果它很大呢?

使用列表,您可以:

那样就好了!

在此先感谢,干杯和BR-马蒂

现在,当我认为收藏中的对象在堆中时。所以我的解决方案不会阻止调用者修改它们!!!CAUSE BOTH Dictionary 都包含对相同对象的引用。这是否适用于上面的示例?

那么如何使这个不可变?