将Collection属性作为只读的最佳方式

时间:2014-04-02 14:34:43

标签: c# .net architecture

收藏属性

public List<MapMarker> Markers { get; set; }
public List<UIReport > Reports { get; set; }

3 个答案:

答案 0 :(得分:4)

要阻止客户分配全新的集合,请使用私有字段(readonly,如果适用)和公共get-only属性。

private readonly IList<T> _items = new List<T>();
public IList<T> Items
{
    get { return _items; }
}

要阻止客户分配全新的收藏品修改您的收藏品,请使用IReadOnlyCollection<T>

public MyClass()
{
    List<T> list = //new list
    _items = new ReadOnlyCollection<T>(list);    
}

private readonly IReadOnlyCollection<T> _items;
public IReadOnlyCollection<T> Items
{
    get { return _items; }
}

将列表作为IEnumerable<T>返回并不是一个非常可靠的选项。客户端可以简单地将可枚举的数据转发回列表,并进行变异。您应该将可变列表包装在ReadOnlyCollection<T>

答案 1 :(得分:0)

如果您想要只读集合,请使用ReadOnlyCollection

var coll = new ReadOnlyCollection<char>("myreadonlycollection".ToCharArray());

答案 2 :(得分:0)

这样的东西?

public List<MapMarker> Markers { get; private set; }
public List<UIReport > Reports { get; private set; }