10

比如说,我们有一个带有私有 List 的泛型类。我们至少可以通过两种方式让它返回这个列表的只读包装器:

public class Test<T>
{
    public List<T> list = new List<T>();

    public IEnumerable<T> Values1
    {
        get
        {
            foreach (T i in list)
                yield return i;
        }
    }

    public IEnumerable<T> Values2
    {
        get
        {
            return list.AsReadOnly();
        }
    }
}

两者都Values1反映Values2基础集合中的任何变化,并防止它通过自身进行修改。

哪种方式更可取?应该注意什么?或者有没有其他更好的方法?

4

1 回答 1

12

如果IEnumerable<T>输出只需要一个,我更喜欢:

public IEnumerable<T> Values
{
    return this.list.AsReadOnly();
}

由于ReadOnlyCollection<T>implements IEnumerable<T>,这为您的对象提供了一个安全的包装,同时仍然灵活高效,并防止强制转换能够设置值。

如果您决定需要在结果中做一些不同的事情,您可以随时更改内部实现。

于 2012-10-02T01:30:25.900 回答