4

我有一个带有集合成员的类。我想防止外部代码直接修改这个集合,而不是使用方法(可以执行适当的验证等)。

这比我想象的要难。这是我正在使用的解决方案。你能告诉我是否有更好的方法来做这个常见的事情吗?这一切似乎有点过度设计。

using System.Collections.Generic;
using System.Collections.ObjectModel;
public class Foo
  {
    private List<Bar> _bars = new List<Bar>();

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

    public void AddBar(Bar bar) //black sheep
    {
      //Insert validation logic here
      _bars.Add(bar);
    }
  }
4

2 回答 2

4

我认为这是一个很好的解决方案。Martin Fowler 在此处讨论了这种方法 Incapculate collection

于 2010-07-28T09:59:18.973 回答
2

您的方法没有任何问题,但是如果您愿意,您可以将 Bars-Property 更改为 IEnumerable,因为 ReadOnlyCollection 实现了 IEnumerable。

public class Foo
{
    private List<Bar> _bars = new List<Bar>();

    public IEnumerable<Bar> Bars { get { return _bars.AsReadOnly(); } }

    public void AddBar(Bar bar) //black sheep
    {
        //Insert validation logic here
        _bars.Add(bar);
    }
}

如果您不在 List 上使用 .AsReadOnly(),则可以将 IEnumeable 强制转换回 List。

于 2010-07-28T10:00:53.247 回答