私は親/子関係obオブジェクトを持ち、親オブジェクトをインラインで作成しようとしています(私はそれが正しい単語ではないと確信しています)。作成した親を独自の作成コードで参照することは可能ですか?オブジェクトのインライン作成で親を参照する方法は?
Parent = new Parent(
{
Name = "Parent",
Child= new Child(/*ReferenceToParent*/)
});
私は親/子関係obオブジェクトを持ち、親オブジェクトをインラインで作成しようとしています(私はそれが正しい単語ではないと確信しています)。作成した親を独自の作成コードで参照することは可能ですか?オブジェクトのインライン作成で親を参照する方法は?
Parent = new Parent(
{
Name = "Parent",
Child= new Child(/*ReferenceToParent*/)
});
このラウンドの唯一の方法は、Child
コンストラクタ自身を呼び出し、this
に合格するParent
コンストラクタのためになります。
public class Parent
{
public Child Child { get; private set; }
public string Name { get; set; }
public Parent()
{
Child = new Child(this);
}
}
public class Child
{
private readonly Parent parent;
public string Name { get; set; }
public Child(Parent parent)
{
this.parent = parent;
}
}
その後:
Parent parent = new Parent
{
Name = "Parent name",
// Sets the Name property on the existing Child
Child = { Name = "Child name" }
};
私はこの種のを避けるためにをしようと、子に他のプロパティを設定することもできます(私はあなたがやろうとしていると仮定している)あなたのオブジェクト初期化子時間が経つにつれてますます手間がかかります。
Parentのインスタンスがまだ作成されていないため、これを行うことはできません。子がそのコンストラクタにParentのインスタンスを必要とする場合は、それを作成する必要があります。 最初にParentのインスタンスを作成し、次にその子をコンストラクタに渡してから、ChildのインスタンスをParentのプロパティに割り当てます。
var parent = new Parent
{
Name = "Parent",
//More here...
};
var child = new Child(parent);
parent.Child = child;
いいえ。の後に、参照が割り当て済みオブジェクトを参照し始めるため、コンストラクタの実行が終了しました。
ありがとうございました。 「トリッキーな部分」を詳しく説明できますか?私はガベージコレクタがそのような循環オブジェクト参照をうまく処理するという印象を受けました。私はシリアライゼーションの問題を想像することができますが、私はここで何も使用する予定はありません。 – Amenti
@Amenti:ガベージコレクタは問題ありませんが、あなた自身のコンストラクタ内で 'this 'への参照を漏らすことは一般的には悪い考えです。' Child'コンストラクタがそのコンストラクタ内で親のものを呼び出そうとすると、完全に初期化されていないオブジェクト上で動作します。微妙で追跡が難しいバグの原因になる可能性があります。 –