2011-07-06 8 views
0

私はこれがコードのにおいであると感じています。これをもっとうまくやっているかもしれませんが、その場合は指摘してください。コンストラクタを持つ2つのクラスは、互いに参照するようになっていますか?

class main 
{ 
    void main() 
    { 
    object A 
    object B 

    A = new SystemA(ref B) 
    B = new SystemB(ref A) 
    } 
} 
class SystemA 
{ 
    SystemB B; 
    public SystemA (ref B) 
    { 
    this.B = B; 
    } 
} 
class SystemB 
{ 
    SystemA A; 
    public SystemA (ref A) 
    { 
    this.A = A; 
    } 
} 

基本的には、2つのクラスを互いに参照して初期化する必要があります。

初期化後に後でアクセスされるときに、2つの子クラスのクラスフィールドに対してこれは機能せず、null参照例外を生成します。

私はおそらく初期化の後にこれらを設定することができたことを認識していますが、これらの割り当てを初期化アクションとして表示するので、これを避けたいと思います。

+0

恐ろしく複雑です。実際のコードを投稿してください。 –

+0

これは、私がそれに遭遇するたびに、そのような構造の作成者を排除したいと思うほど多くのフープジャンプを必要とします。 – KevinDTimm

+0

@Brian - これは私が参照しているものです。ここに入るトリックがあります(そして彼らは吸う)。 – KevinDTimm

答えて

3

あなたが実際にコンパイルされたコードを与えた場合、私はそれだけでnullへの参照を格納SystemAで終わるだろう疑う - それはあなたがAを構築Bの値だからです。

参照を必要とする2つのクラスを持つことは間違いなくコードの匂いですが、のいずれも互いに参照しない限り、参照することはできません。例えば

class SystemA 
{ 
    private readonly SystemB systemB; 

    public SystemA() 
    { 
     systemB = new SystemB(this); 
    } 
} 

class SystemB 
{ 
    private readonly SystemA systemA; 

    public SystemB(SystemA systemA) 
    { 
     this.systemA = systemA; 
    } 
} 

は今、あなたは、コンストラクタでoutパラメータを使用しますが、どちらかが、他の、またはへのアクセスを与えるそれらのいずれかにプロパティを置くことができ(これは本当に厄介である)、その後両方の値にアクセスする必要がある場合:これをしないでください

SystemB b; 
SystemA a = new SystemA(out b); 

public SystemA(out systemB) 
{ 
    systemB = new SystemB(this); 
    this.systemB = systemB; 
} 

次にとしてそれを呼び出しますしかし、。

関連する問題