返回List <T>的只读包装的哪种方式更可取?

hor*_*rgh 10 c# generics ienumerable readonly-collection

比如,我们有一个带有私有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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

双方Values1Values2反映底层集合中的任何chages并防止它通过自己修改.

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

Ree*_*sey 11

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

public IEnumerable<T> Values
{
    return this.list.AsReadOnly();
}
Run Code Online (Sandbox Code Playgroud)

ReadOnlyCollection<T>实现开始IEnumerable<T>,这为您的对象提供了一个安全的包装器,同时仍然保持灵活和高效,并防止转换器能够设置值.

如果您决定需要在结果中执行不同的操作,则可以随后更改内部实现.