列出<t>只读私有集</t>

时间:2011-01-20 15:30:23

标签: c# .net generics c#-3.0

我如何公开List<T>以便它只读,但可以私下设置?

这不起作用:

public List<string> myList {readonly get; private set; }

即使你这样做:

public List<string> myList {get; private set; }

你仍然可以这样做:

myList.Add("TEST"); //This should not be allowed

我想你可以:

public List<string> myList {get{ return otherList;}}
private List<string> otherList {get;set;}

15 个答案:

答案 0 :(得分:93)

我认为你正在混合概念。

public List<string> myList {get; private set;}

已经是“只读”。也就是说,在此课程之外,没有任何内容可以将myList设置为List<string>

的其他实例

但是,如果您想要一个只读列表,如“我不希望人们能够修改列表内容”,那么您需要公开ReadOnlyCollection<string>。您可以通过以下方式执行此操作:

private List<string> actualList = new List<string>();
public ReadOnlyCollection<string> myList
{
  get{ return actualList.AsReadOnly();}
}

请注意,在第一个代码段中,其他人可以操作List,但无法更改您拥有的列表。在第二个片段中,其他人将获得一个他们无法修改的只读列表。

答案 1 :(得分:11)

如果您希望只读集合使用ReadOnlyCollection<T>,而不是List<T>

public ReadOnlyCollection<string> MyList { get; private set; }

答案 2 :(得分:11)

我更喜欢使用IEnumerable

private readonly List<string> _list = new List<string>();

public IEnumerable<string> Values // Adding is not allowed - only iteration
{
   get { return _list; }
}

答案 3 :(得分:10)

返回一个ReadOnlyCollection,它实现了IList&lt;&gt;

private List<string> myList;

public IList<string> MyList
{
  get{return myList.AsReadOnly();}
}

答案 4 :(得分:4)

有一个名为ReadOnlyCollection<T>的集合 - 你正在寻找什么?

答案 5 :(得分:4)

您可以使用List的AsReadOnly()方法返回只读包装。

答案 6 :(得分:4)

private List<string> my_list;

public ReadOnlyCollection<string> myList
{
    get { return my_list.AsReadOnly(); }
    private set { my_list = value; }
}

答案 7 :(得分:3)

    private List<string> _items = new List<string>();         

    public ReadOnlyCollection<string> Items

    {

        get { return _items.AsReadOnly(); }

        private set { _items = value }

    }

答案 8 :(得分:3)

这是一种方式

public class MyClass
    {
        private List<string> _myList;
        public ReadOnlyCollection<string> PublicReadOnlyList { get { return _myList.AsReadOnly(); } }

        public MyClass()
        {
            _myList = new List<string>();
            _myList.Add("tesT");
            _myList.Add("tesT1");
            _myList.Add("tesT2");

            //(_myList.AsReadOnly() as List<string>).Add("test 5");
        }

    }

答案 9 :(得分:3)

在.NET 4.5框架中,您只能公开IReadOnlyList接口。 类似的东西:

private List<string> _mylist;
public IReadOnlyList<string> myList { get {return _myList;} }

或者如果你想阻止不需要的投射到IList

private List<string> _mylist;
public IReadOnlyList<string> myList { get {return new List<string>(_myList);} }

答案 10 :(得分:2)

private List<string> myList;

public string this[int i]
{
    get { return myList[i]; }
    set { myList[i] = value; }
}

答案 11 :(得分:1)

为什么使用List。听起来你真正想暴露的是IEnumerable

public IEnumerable<string> myList { get; private set; }

现在,班级用户可以阅读这些项目,但不能更改列表。

答案 12 :(得分:1)

您也可以创建普通列表,但是通过IEnumerable

类型的属性公开它
private List<int> _list = new List<int>();

public IEnumerable<int> publicCollection{
   get { return _list; }
}

答案 13 :(得分:0)

有点晚了,但是:我不喜欢使用ReadOnlyCollection包装器,因为它仍然公开了修改集合的所有方法,在运行时访问时都会抛出NotSupportedException 。换句话说,它实现了IList接口,但在运行时违反了同一个合同。

为了表达我真的暴露了一个不可变列表,我通常使用自定义IIndexable接口,它将Length和索引器添加到IEnumerable(在this CodeProject article中描述)。它是一个包装器,因为它应该首先在IMHO中完成。

答案 14 :(得分:-1)

我没有看到提到这个选项:

private List<string> myList;

public List<string> MyList
{
    get { return myList.AsReadOnly().ToList(); }
}

这应该允许您公开只读列表。