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

标签 c# generics ienumerable readonly-collection

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

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();
        }
    }
}

Values1Values2 都反射(reflect)了底层集合中的任何变化,并防止它通过自身进行修改。

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

最佳答案

如果只有一个 IEnumerable<T>是输出所必需的,我更喜欢:

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

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

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

关于c# - 返回 List<T> 的只读包装器的哪种方式更可取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12683352/

相关文章:

swift 2 : Why doesn't this Dictionary extension compiles?

c# - Azure DevOps API 与语言无关吗?

c# - WPF 数据绑定(bind)错误 -- System.Windows.Data 错误 : 40

typescript - 将Typescript泛型中的类型限制为几种类型之一

c# - IEnumerable<List<T>> 到 List<T>

c# - 计算 IEnumerable<HttpPostedFileBase> 的非空元素

c# - 为什么 List.Count() 和 IEnumerable.Count() 返回不同的结果?

c# - ViewModel 中的可绑定(bind)字段

c# - usercontrol 中的所有控件都为 null

generics - 带有通用参数的 to_string