C#中的只读列表

时间:2011-01-13 12:31:48

标签: c# .net list

我有一些List的课程 - 属性:

class Foo {
  private List<int> myList;
}

我想提供对此字段的访问权限仅供阅读。

即。我希望属性可以访问Enumerable,Count等,并且无法访问Clear,Add,Remove等。我怎么能这样做?

5 个答案:

答案 0 :(得分:26)

如果您想要列表的只读视图,可以使用ReadOnlyCollection<T>

class Foo {
    private ReadOnlyCollection<int> myList;
}

答案 1 :(得分:12)

您可以使用List<T>

方法将ReadOnlyCollection<T>公开为AsReadOnly()
class Foo {

  private List<int> myList;

  public ReadOnlyCollection<int> ReadOnlyList {
     get {
         myList.AsReadOnly();
     }
  }
}

巧妙的是,如果您从私人列表中添加/删除任何内容,它也会反映在返回的ReadOnlyCollection

答案 2 :(得分:9)

我会去

public sealed class Foo
{
    private readonly List<object> _items = new List<object>();

    public IEnumerable<object> Items
    {
        get
        {
            foreach (var item in this._items)
            {
                yield return item;
            }
        }
    }
}

答案 3 :(得分:5)

现在有一个Immutable Collections库正是这样做的。您可以通过nuget安装。

  

从.NET开始支持不可变集合类   框架4.5。

https://msdn.microsoft.com/en-us/library/dn385366%28v=vs.110%29.aspx

  

System.Collections.Immutable命名空间提供通用的不可变   可用于这些方案的集合类型,包括:   ImmutableArray&LT; T&gt;中   ImmutableDictionary&LT; TKEY,TValue&gt;中   ImmutableSortedDictionary&lt; T&gt;,ImmutableHashSet&lt; T&gt;,   ImmutableList&lt; T&gt;,ImmutableQueue&lt; T&gt;,ImmutableSortedSet&lt; T&gt;,   ImmutableStack&LT; T&GT;

用法示例:

class Foo
{
    public ImmutableList<int> myList { get; private set; }

    public Foo(IEnumerable<int> list)
    {
        myList = list.ToImmutableList();
    }
}

答案 4 :(得分:0)

如果您在班级中声明了一个只读列表,您仍然可以向其中添加项目。

如果您不想添加或更改任何内容,则应按照Darin的建议使用ReadOnlyCollection<T>

如果要添加,删除列表中的项目但不想更改内容,可以使用readonly List<T>