5

Personプロパティ、父、および子のリストを含むというクラスがあります。

AddChildmethodではなく、 Methodのみを使用して子を追加するようにしたいのですList.Addが、使用を制限するにはどうすればよいですか?

public class Person
{
  private List<Person> _children = new List<Person>();
  public string Name { get; set; }
  public Person Father { get; set; }
  public List<Person> Children 
  { 
    get
    {
       return _children;
    } 
  }
  public void AddChild(string name)
  {
      _children.Add( new Person { Name = name, Father = this });
  }
}
4

7 に答える 7

12

子を ReadOnlyCollection として公開します。

public IList<Person> Children  
{  
    get 
    { 
       return new ReadOnlyCollection<Person>(_children);
    }  
} 
于 2009-10-07T11:46:19.523 に答える
8

Childrenとして公開IEnumerable<T>

于 2009-10-07T11:46:48.273 に答える
8

Children プロパティを次のように変更します。

public IList<Person> Children 
{ 
  get
  {
     return _children.AsReadOnly();
  } 
}
于 2009-10-07T11:49:18.660 に答える
7

基になる を公開している場合List<T>、要するに: できません。

独自のコレクション ラッパー クラスを作成することも、継承することもできますCollection<T>(これは引き続き を公開しますが、追加する前にデータをセンス チェックするためにいくつかのことをAdd行うことができます)。override

于 2009-10-07T11:47:47.900 に答える
3

Children プロパティを次のように公開します。ReadOnlyCollection<Person>

public ReadOnlyCollection<Person> Children
{
     get {return _children.AsReadOnly();}
}
于 2009-10-07T11:49:06.383 に答える
3

.NET 4.5 以降を使用している場合は、次のように返すことができ_childrenますIReadOnlyList<T>

public IReadOnlyList<Person> Children
{
    get
    {
        return _children;
    }
}

IList<Person>これはviaを返すこととどう違うの_children.AsReadOnly()ですか? IReadOnlyList<Person>ミューテーションメソッドすらありません。次のコードを検討してください。

somePerson.Children[0] = null;

このコードを使用IReadOnlyList<Person>すると、コンパイルに失敗します。.AsReadOnly()このコードを使用すると、実行時例外が発生します。

ReadOnlyCollection<Person>これはviaを返すこととどう違うの_children.AsReadOnly()ですか? ReadOnlyCollection<Person>作成されたラッパー オブジェクトはありません。それを除けば、大きな違いは見られません。

于 2013-11-27T07:22:07.403 に答える
2

IEnumerable は問題なく動作します。

public IEnumerable<Person> Children
{
    get
    {
        return _children.AsReadOnly();
    }
}

または、より長く曲がりくねった:

public IEnumerable<Person> Children
{
    get
    {
        foreach (Person child in _children)
        {
            yield return child;
        }
    }
}
于 2009-10-07T11:53:40.447 に答える