0

我有如下的类结构,下面的场景将创建一个循环引用。如何避免这种情况?

public class classA
{
    public classA()
    {
        classB b= new classB();
        b.classBMethod();
    }
    public void classAMethod()
    {
        Console.WriteLine("Class A Method");
    }
}
public class classB
{
    public classB()
    {
        classC c = new classC();
        c.classCMethod();
    }
    public void classBMethod()
    {
        Console.WriteLine("Class B Method");
    }
}
public class classC
{
    public classC()
    {
        classA a = new classA();
        a.classAMethod();
    }
    public void classCMethod()
    {
        Console.WriteLine("Class C Method");
    }
}

如何避免循环引用?请告诉我设计这个的不同选择

4

2 回答 2

5

您的代码没有循环引用问题。
当您开始遵循引用并最终到达您开始的地方时,就会发生循环引用。在您的情况下,您所做的是声明局部变量,然后您有:

new ClassA()-> (calls) -> new ClassB()->(calls)->new ClassC()->calls->new ClassA()-> (calls) -> new ClassB()->(calls)-> etc forever  

GC 足够聪明,可以解决循环引用,但是您所做的从根本上来说是有缺陷的。也许您应该解释一下您要实现的目标。

于 2012-08-20T07:19:15.617 回答
2

这正在创建一个没有尽头的螺旋数据结构。然而,解决这个谜题并且仍然能够从任何类(A、B 或 C)开始的最简单方法是向确定是否发生循环的对象添加一个公共布尔标志。如果此标志为假,则继续,如果为真,则停止循环。相反,如果您试图创建这个没有尽头的螺旋,您可能需要添加一个每帧调用一次的更新方法,以避免实例中的操作过载。

如果我确切地知道你试图用这种逻辑创建什么,我可以给出一个不那么模糊的答案。如果不清楚,我很抱歉。

于 2012-08-20T07:22:10.007 回答