所以,对象初始化器是各种方便的 - 特别是如果你正在做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)
它甚至没有名称来引用它!
我该如何解决这个问题?我可以简单地使用对象初始化器来制作嵌套引用吗?
我可以简单地使用对象初始化器来制作嵌套引用吗?
你是对的 - 你做不到.会有一个循环; 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)
| 归档时间: |
|
| 查看次数: |
3204 次 |
| 最近记录: |