在内部(在同一个程序集中)向ReadOnlyCollection <T>添加项目的最佳方法?

Ian*_*Ian 4 c# collections design-patterns

我有以下课程:

public class Foo
{
     public List<Bar> Bars {get; internal set;}
}
Run Code Online (Sandbox Code Playgroud)

现在我想制作Bars一个不能公开改变ReadOnlyCollection的内容Bars:

public class Foo
{
     public ReadOnlyCollection<Bar> Bars {get; internal set;}
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我在同一个程序集中有一个需要添加项目的类Bars,那么最好的方法是什么?

这就是我现在这样做的方式:

public class FooHelper
{
   public FooHelper()
   {
      Foo foo = new Foo();
      //Code to modify the collection
      List<Bar> bars = foo.Bars.ToList<Bar>();
      bars.Add(new Bar("BAR BAR BAR"));
      foo.Bars = bars.AsReadOnly();
   }
}
Run Code Online (Sandbox Code Playgroud)

我意识到如果我有这样的Private List<Bar>in 会更容易Foo:

public class Foo
{
     private List<Bar> _bars;
     public ReadOnlyCollection<Bar> Bars {get { return _bars.AsReadOnly; }}         
}
Run Code Online (Sandbox Code Playgroud)

...但是通过这种方法,我将如何添加项目_bars

我应该将其设为内部,使其成为内部属性,还是添加新的内部AddBar()方法?

Col*_*inE 10

我个人会去添加一个内部的AddBar方法,如下所示:

public class Foo
{
     private List<Bar> _bars;

     public ReadOnlyCollection<Bar> Bars {get { return _bars.AsReadOnly; }}         

     internal void AddBar(Bar bar)
     {
          _bars.Add(bar);
     }
}
Run Code Online (Sandbox Code Playgroud)

其他程序集将看到readonly集合,使其不可变.同一个程序集中的代码只能添加Bar项,为您提供"防御性"API.