Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET 4.0中的只读列表或不可修改列表_C#_Java_.net_Readonly Collection - Fatal编程技术网

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

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

据我所知,.NET4.0仍然缺少只读列表。为什么框架仍然缺少这种功能?这不是最常见的功能之一吗

Java与C语言相比的少数几个优势之一是它采用了方法的形式,而在IList或List中似乎早就应该采用这种形式了


使用
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;
    }
}