C# .NET 4.0中的只读列表或不可修改列表
据我所知,.NET4.0仍然缺少只读列表。为什么框架仍然缺少这种功能?这不是最常见的功能之一吗 Java与C语言相比的少数几个优势之一是它采用了方法的形式,而在IList或List中似乎早就应该采用这种形式了C# .NET 4.0中的只读列表或不可修改列表,c#,java,.net,readonly-collection,C#,Java,.net,Readonly Collection,据我所知,.NET4.0仍然缺少只读列表。为什么框架仍然缺少这种功能?这不是最常见的功能之一吗 Java与C语言相比的少数几个优势之一是它采用了方法的形式,而在IList或List中似乎早就应该采用这种形式了 使用IEnumerable是解决该问题的最简单方法-ToList可以使用并返回一份副本。在2.0中,您可以调用AsReadOnly以获取列表的只读版本。或者将现有的IList包装在ReadOnlyCollection对象中。框架中已经存在的如何?您正在寻找的,自.NET2以来一直存在 IL
使用
IEnumerable
是解决该问题的最简单方法-ToList
可以使用并返回一份副本。在2.0中,您可以调用AsReadOnly
以获取列表的只读版本。或者将现有的IList
包装在ReadOnlyCollection
对象中。框架中已经存在的如何?您正在寻找的,自.NET2以来一直存在
IList<string> foo = ...;
// ...
ReadOnlyCollection<string> bar = new ReadOnlyCollection<string>(foo);
IList foo=。。。;
// ...
ReadOnlyCollection条=新的ReadOnlyCollection(foo);
或
listfoo=。。。;
// ...
ReadOnlyCollection bar=foo.AsReadOnly();
这将创建一个只读视图,反映对包装的集合所做的更改。如果列表的最常见模式是遍历所有元素,
IEnumerable
或IQueryable
也可以有效地充当只读列表。有什么问题吗?对于喜欢使用接口的人:
.NET 4.5添加了通用接口,例如通过List
实现
它类似于并添加了一个
项
索引器属性。在IEnumerable上创建一个扩展方法ToReadOnlyList(),然后
IEnumerable<int> ints = new int[] { 1, 2, 3 };
var intsReadOnly = ints.ToReadOnlyList();
//intsReadOnly [2]= 9; //compile error, readonly
IEnumerable int=new int[]{1,2,3};
var intsReadOnly=ints.ToReadOnlyList();
//intsreadoly[2]=9//编译错误,只读
下面是扩展方法
public static class Utility
{
public static IReadOnlyList<T> ToReadOnlyList<T>(this IEnumerable<T> items)
{
IReadOnlyList<T> rol = items.ToList();
return rol;
}
}
公共静态类实用程序
{
公共静态IReadOnlyList ToReadOnlyList(此IEnumerable items)
{
IREADONLILIST rol=items.ToList();
返回rol;
}
}
也请参见如果您将列表公开为IEnumerable,那么消费者可以简单地将其转换回列表并对其进行修改。当然,这并不是一种防弹措施-您还可以阅读私有字段并跟踪原始列表。它更像是描述了保持只读的意图。您也不是通过调用
ToList()
来修改原始列表,只是一个copy注意IEnumerable
不是一套完整的“只读”方法,例如,它不包含像Contains
这样的方法。我现在问这个问题感到有点愚蠢——我不知道ReadOnlyCollectiondon't be——我也不知道,当我去寻找同样的东西时,发现你的问题是一个很难找到的令人烦恼的类。它位于System.Collections.ObjectModel命名空间中,而不是我希望在其中找到它的System.Collections.Generic。我想这是因为在泛型名称空间存在之前,它就在这里。尽管如此,我仍然希望基类保留在ObjectModel中,而泛型类将添加到泛型中。我想他们有他们的理由,但我觉得这很烦人。@BlueMonkMN:请参考这个,找出为什么它与集合分开。通用名称空间。但那不是列表,它是集合。因此,如果您使用它,您需要修改所有代码以使用集合而不是列表。这与集合是等效的。不可修改列表(List)我在.NET 4中错过了这一点,因为我使用的是IList而不是真正的列表。请务必注意,只要您处理的是一个列表,AsReadOnly在.NET 4中仍然可用。似乎拥有一个真正的只读列表的唯一真正方法是编写自己的,据我所知,没有一个内置类支持列表的所有“只读”功能,比如包含,LINQ查询等。
public static class Utility
{
public static IReadOnlyList<T> ToReadOnlyList<T>(this IEnumerable<T> items)
{
IReadOnlyList<T> rol = items.ToList();
return rol;
}
}