1

コンストラクターの読み取り専用コレクション プロパティに項目を追加できる ac# 言語構造はありますか? 私はこのようなことをしたい:

public class Node{
    public IList<Node> Children {get; protected set;}
    public Node(){
        Children = new ObservableList<Node>();
    }
}

...私のコードのどこかに...

var node = new Node {Children.Add(new Node())};

(良い例ではありませんが、これでアイデアが伝わることを願っています)...

アップデート

申し訳ありませんが、もっと明確にする必要があります。私はこのクラスを書いていないNodeので、変更できません。Nodeクラスが変更可能ではないと仮定して、2 番目のスニペットのパラメーターなしのコンストラクターで読み取り専用コレクションに追加できる ac# 言語の概念があるかどうかを尋ねています。

4

4 に答える 4

4

これを試して。建設に要素を追加することは間違いなく可能です

var node = new Node
 {
     Children =
    {
        new Node(),
        new Node()
    }
 };
于 2013-10-10T19:32:19.760 に答える
0

2 番目のコード スニペットのコレクション初期化子構文を使用するには、Node クラスに IEnumerable を実装し、署名付きのパブリック メソッドを含める必要があります。

void Add(Node child)

したがって、そのようなクラスは、あなたが望む不変性を提供できません。あなたの問題に対する最善の解決策は、これを行うことだと思います

public class Node
{
  public readonly IEnumerable<Node> Children;

  public Node(IEnumerable<Node> children)
  {
    Children = children;
  }
}

または、IEnumerable の遅延実行が気に入らない場合:

public class Node
{
  public readonly ReadOnlyCollection<Node> Children;

  public Node(IEnumerable<Node> children)
  {
    Children = new ReadOnlyCollection<Node>(children);
  }
}
于 2013-10-10T19:39:44.300 に答える
-1

バッキング フィールドを「Children」プロパティに追加し、作成中にバッキング フィールドに入力するだけです。

そのようです

public class Node
        {
            private IList<Node> _Children;
            public IList<Node> Children { get { return _Children; } }
            public Node(IList<Node> children)
            {
                _Children = children;
            }
        }

次に、これを行うことができます

var node = new Node((new ObservableList<Node>()).Add(new Node()));
于 2013-10-10T19:25:24.890 に答える