2010-12-08 8 views
0

J'ai une question simple à propos de .net garbage collection. Dans le code suivant, je crée une instance de classe d'écouteur dans le constructeur de l'objet enfant. Ma question est de savoir si la classe de l'écouteur est collectée par le garbage collection avant l'enfant ou l'objet principal car il n'y a aucune référence directe à cela..net C# garbage-collection question

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(); 
    } 
} 

Répondre

6

Il est une référence à elle, dans la liste d'appel child.SomeEvent.

Les gestionnaires d'événements suspendus sont la principale cause des fuites de mémoire dans les applications .NET.

Il sera collecté une fois que l'objet child aura été collecté, mais si vous voulez qu'il soit collecté auparavant, vous devrez le retirer de la liste d'invocation (en utilisant l'opérateur -=).

2

Le but du GC est de ne pas avoir à vous soucier du moment où les choses sont collectées. Ils sont collectés quand ils ne sont plus nécessaires et sans ordre particulier. Il n'y a aucun moyen de garantir la collecte d'un objet avant un autre objet.