将内部集合作为IEnumerable <T>返回的标准方法

JF *_*ier 2 c# ienumerable

说我有:

class foo
{
  private List<T> bar;
  public IEnumerable<T> GetBar();
}
Run Code Online (Sandbox Code Playgroud)

哪里GetBar()应该返回那个相同的List,而不暴露内部(即没有其他类应该能够从内部列表中删除元素,重新排序等)并避免过度复制.这样做的标准方法是什么?

Joe*_*Joe 8

如果要返回不可变列表,请返回bar.AsReadOnly().

通常,公开此只读包装器的成员将是类型IList<T>.IEnumerable<T>如果我想向消费者表明实现可能使用延迟枚举,我只会低估.

我个人认为它是一个属性,并在每次调用时返回相同的只读包装:

class Foo
{
    private List<T> bar;
    private IList<T> readonlyBar;

    public Foo()
    {
        bar = ...;
        readonlyBar = bar.AsReadOnly();
    }

    public IList<T> Bar
    {
        get { return readonlyBar; }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ufu*_*arı 7

您可以从方法返回ReadOnlyCollection的实例:

return new ReadOnlyCollection(items);
Run Code Online (Sandbox Code Playgroud)