嵌套使用C#Object Initializers

And*_*rst 8 c# c#-3.0

所以,对象初始化器是各种方便的 - 特别是如果你正在做linq,它们是完全必要的 - 但我不能完全弄清楚这个:

public class Class1 {
   public Class2 instance;
}

public class Class2 {
   public Class1 parent;
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

Class1 class1 = new Class1();
class1.instance = new Class2();
class1.parent = class1;
Run Code Online (Sandbox Code Playgroud)

作为初始化程序:

Class1 class1 = new Class1() {
    instance = new Class2() {
        parent = class1
    }
};
Run Code Online (Sandbox Code Playgroud)

这不起作用,class1应该是一个未分配的局部变量.当你做类似的事情时,它在Linq中变得更加棘手

select new Class1() { ...
Run Code Online (Sandbox Code Playgroud)

它甚至没有名称来引用它!

我该如何解决这个问题?我可以简单地使用对象初始化器来制作嵌套引用吗?

Dan*_*ner 7

我可以简单地使用对象初始化器来制作嵌套引用吗?

你是对的 - 你做不到.会有一个循环; A需要B进行初始化,但B需要A之前.确切地说 - 您当然可以创建嵌套对象初始化器,但不能使用循环依赖项.

但你可以 - 我建议你应该尽可能 - 按照以下方式解决这个问题.

public class A
{
   public B Child
   {
      get { return this.child; }
      set
      {
         if (this.child != value)
         {
            this.child = value;
            this.child.Parent = this;
         }
      }
   }
   private B child = null;
}

public class B
{
   public A Parent
   {
      get { return this.parent; }
      set
      {
         if (this.parent != value)
         {
            this.parent = value;
            this.parent.Child = this;
         }
      }
   }
   private A parent = null;
}
Run Code Online (Sandbox Code Playgroud)

在属性中构建关系有一个好处,如果您忘记了其中一个初始化语句,则无法获得不一致的状态.很明显,这是一个次优的解决方案,因为你需要两个语句来完成一件事.

b.Parent = a;
a.Child = b;
Run Code Online (Sandbox Code Playgroud)

通过属性中的逻辑,您只需使用一个语句即可完成任务.

a.Child = b;
Run Code Online (Sandbox Code Playgroud)

或者反过来说.

b.Parent = a;
Run Code Online (Sandbox Code Playgroud)

最后使用对象初始化器语法.

A a = new A { Child = new B() };
Run Code Online (Sandbox Code Playgroud)