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

それは良い解決策だと思います。このアプローチについては、 MartinFowlerがここで説明しています。

于 2010-07-28T09:59:18.973 に答える
2

アプローチに問題はありませんが、ReadOnlyCollectionはIEnumerableを実装しているため、必要に応じてBars-Propertyを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);
    }
}

リストで.AsReadOnly()を使用しない場合は、IEnumeableをリストにキャストして戻すことができます。

于 2010-07-28T10:00:53.247 に答える