2010-12-08 9 views
0

ネットガベージコレクションについて簡単な質問があります。次のコードでは、子オブジェクトのコンストラクタでリスナークラスインスタンスを作成します。私の質問は、リスナークラスはどこに直接参照されていないので、子またはメインオブジェクトの前にガベージコレクションによって収集されるのですか?.net C#ガベージコレクション質問

あり
class MainObject 
{ 
    public void DoSomething() 
    { 

    } 
} 

delegate void someEventHandler(); 
class ChildObject 
{ 
    public event someEventHandler SomeEvent; 
    MainObject main; 
    public ChildObject(MainObject main) 
    { 
     this.main = main; 
     new Listener(this, main); 
    } 
} 


class Listener 
{ 
    MainObject main; 

    public Listener(ChildObject child, MainObject main) 
    { 
     this.main = main; 
     child.SomeEvent += new someEventHandler(child_SomeEvent); 
    } 
    void child_SomeEvent() 
    { 
     main.DoSomething(); 
    } 
} 

答えて

6

呼び出しリストchild.SomeEventで、それへの参照です。

ダングリングイベントハンドラは、.NETアプリケーションのメモリリークの第1の原因です。

childオブジェクトが収集された時点で収集されますが、手前で収集する場合は、-=演算子を使用して呼び出しリストから削除する必要があります。

2

GCの目的は、収集するタイミングを心配する必要がないようにすることです。彼らはもはや必要がなくなり、特別な順序で収集されません。あるオブジェクトのコレクションを別のオブジェクトの前に保証する方法はありません。