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

Chr*_*s S 97 .net c# java readonly-collection

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

Java对C#的优势之一就是Collections.unmodifiablelist(list)方法的形式,它似乎早在IList <T>或List <T>中已经过期了.

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

Luk*_*keH 141

你正在寻找ReadOnlyCollection,自.NET2以来一直存在.

IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);
Run Code Online (Sandbox Code Playgroud)

要么

List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();
Run Code Online (Sandbox Code Playgroud)

这将创建一个只读视图,该视图反映对包装集合所做的更改.

  • 不要 - 当我去寻找同样的事情并找到你的问题时,我也没有 (53认同)
  • 这是一个令人烦恼的难以找到的课程.它位于System.Collections.ObjectModel命名空间中,而不是System.Collections.Generic,我希望在其中找到它.我想这是因为它存在于Generic命名空间之前的位置.我仍然希望基类保留在ObjectModel中,并将通用类添加到Generic中.我想他们有他们的理由,但我觉得很烦人. (9认同)
  • 但这不是一个List,它是一个集合.因此,如果您使用它,则需要修改所有代码以使用Collection而不是List. (7认同)
  • @BlueMonkMN:请参考这篇文章(http://blogs.msdn.com/b/kcwalina/archive/2005/03/15/396086.aspx),找出它与Collections.Generic命名空间分开的原因. (5认同)

Jas*_*tts 13

框架内已经有ReadOnlyCollection怎么样?


Ana*_*tts 11

如果列表中最常见的模式是迭代所有元素,IEnumerable<T>或者IQueryable<T>也可以有效地充当只读列表.

  • 你不是通过调用`ToList()`来修改原始列表,只是一个副本 (5认同)
  • 如果您将List公开为IEnumerable,那么消费者可以简单地将其转换回List并对其进行修改. (4认同)
  • 当然,但它并不打算成为一种防弹措施 - 您也可以阅读私人字段并追踪原始列表.它更像是描述这应该保持只读的意图. (4认同)

Mar*_*tin 11

对于那些喜欢使用接口的人:.NET 4.5添加了通用IReadOnlyList接口,List<T>例如它.

它类似于IReadOnlyCollection并添加了一个Item索引器属性.


Pau*_*der 8

在2.0中,您可以调用AsReadOnly以获取列表的只读版本.或者将现有的包装IList在一个ReadOnlyCollection<T>对象中.


Mat*_*ser 7

System.Collections.ObjectModel.ReadOnlyCollection有什么问题?

  • 也许这不是一个清单? (3认同)