据我所知,.NET 4.0 仍然缺少只读列表。为什么框架仍然缺少这个功能?这不是领域驱动设计最常见的功能之一吗?
Java 相对于 C# 的少数优势之一是Collections.unmodifiablelist(list)方法的形式,它在 IList<T> 或 List<T> 中似乎早就应该使用了。
使用IEnumerable<T>
是该问题的最简单解决方案 -ToList
可以使用并返回副本。
据我所知,.NET 4.0 仍然缺少只读列表。为什么框架仍然缺少这个功能?这不是领域驱动设计最常见的功能之一吗?
Java 相对于 C# 的少数优势之一是Collections.unmodifiablelist(list)方法的形式,它在 IList<T> 或 List<T> 中似乎早就应该使用了。
使用IEnumerable<T>
是该问题的最简单解决方案 -ToList
可以使用并返回副本。
您正在寻找ReadOnlyCollection
自 .NET2 以来一直存在的 .
IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);
或者
List<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = foo.AsReadOnly();
这将创建一个只读视图,它反映对包装集合所做的更改。
对于喜欢使用接口的人:.NET 4.5 增加了通用IReadOnlyList
接口,List<T>
例如实现。
它类似于IReadOnlyCollection
并添加了Item
索引器属性。
框架中已经存在的ReadOnlyCollection怎么样?
如果列表的最常见模式是遍历所有元素,IEnumerable<T>
或者IQueryable<T>
也可以有效地充当只读列表。
在 2.0 中,您可以调用AsReadOnly
以获取列表的只读版本。或者将现有对象包装IList
在ReadOnlyCollection<T>
对象中。
在 IEnumerable 上创建一个扩展方法 ToReadOnlyList(),然后
IEnumerable<int> ints = new int[] { 1, 2, 3 };
var intsReadOnly = ints.ToReadOnlyList();
//intsReadOnly [2]= 9; //compile error, readonly
这是扩展方法
public static class Utility
{
public static IReadOnlyList<T> ToReadOnlyList<T>(this IEnumerable<T> items)
{
IReadOnlyList<T> rol = items.ToList();
return rol;
}
}
也见马丁的回答