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)から開始できる最も簡単な方法は、サイクルが発生したかどうかを判別するパブリックブールフラグをオブジェクトに追加することです。このフラグがfalseの場合は続行し、trueの場合はサイクルを停止します。代わりに、終わりのないこのスパイラルを作成しようとしている場合は、インスタンスでの操作の過負荷を回避するために、フレームごとに1回呼び出される更新メソッドを追加する必要があります。

このタイプのロジックで何を作成しようとしているのかを正確に知っていれば、漠然とした答えを出すことはできません。不明な点がありましたらごめんなさい。

于 2012-08-20T07:22:10.007 に答える