我有三个班级,他们之间有一个循环引用。
class A
{
public A()
{
B obj = new B();
}
}
class B
{
public B()
{
C obj = new C();
}
}
class C
{
public C()
{
A obj = new A();
}
}
当我创建A
的对象时,它会抛出异常。
我如何创建循环引用彼此的类实例?
答案 0 :(得分:6)
当我创建A的对象时,它会抛出异常
是的,它会的。创建A
会创建一个新的B
,用于创建新的C
,从而创建新的A
等。
我如何解决循环引用。
据推测,您希望C
构造函数了解原始A
?如果是这样,有两种选择:
this
从A
构造函数传递给B
构造函数,然后将其从B
构造函数传递给C
构造函数。这在允许this
转义A
的构造函数方面是令人讨厌的,应该小心地完成非常。 (B
和C
在有机会完成初始化之前不应该调用实例上的任何方法。)答案 1 :(得分:4)
你可以这样做:
class A
{
public B b;
public A()
{
this.b = new B(new C(this));
}
}
class B
{
public C c;
public B(C c)
{
this.c = c;
}
}
class C
{
public A a;
public C(A a)
{
this.a = a;
}
}
答案 2 :(得分:2)
最简单的方法是创建一个定义A类公共接口的接口IA,然后创建A类实现接口IA。 然后添加一个可以创建A实例并返回IA的工厂类。这样,类C不需要知道类A,并且循环引用被破坏。
答案 3 :(得分:2)
您也可以尝试加载对象lazily。这样,它们实际上不会立即被构造,也不会进入构造的循环循环,而是在你真正需要时构造它们。
您可以尝试在MSDN文章中使用C#的Lazy<T>
实现,或通过使用get{ }
构建访问权限来处理涉及properties的内容。
答案 4 :(得分:0)
当你调用A,B或C的构造函数时,你总会得到一个异常。也许你可以通过将一个参数传递给构造函数来解决它,但我想知道你想用这个结构做什么。你能告诉我吗?