2009-08-19 7 views
2

Mon fichier designer.cs a ce talon:Comment est OnDispose de contrôle appelé - C#

protected override void Dispose(bool disposing) 
    { 
    if (disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 
    base.Dispose(disposing); 
    } 

J'ai une application C# qui a une forme que j'invoque mon contrôle utilisateur sur. Lorsque je ferme le formulaire, dois-je appeler explicitement la méthode usercontrol.Dipose?

Répondre

0

Si l'objet n'est pas dans un bloc d'utilisation, alors oui, vous devez appeler la méthode d'élimination. Ceci étant dit, vous pouvez incorporer la méthode élimination dans le finaliseur de l'objet de contrôle, de sorte que lorsque l'objet est éliminé par le CPG, la méthode d'élimination est appelée. Ce type de méthode va à l'encontre du but de la méthode Dispose (puisque la méthode dispose est utilisée pour libérer les objets enfants avant que l'objet parent ne passe au GC), mais vous savez que les objets explicitement fermés par cette méthode sont appelés.

bool disposed 

~Object 
{ 
    if(!disposed) 
     Dispose(); 
} 

Dispose and finalizers link

Another dispose and finalizers link (Joe Duffy)

+0

Kevin, est-ce un comportement similaire pour un contrôle C# invoqué par une application C++? Que l'application C++ aurait besoin d'appeler explicitement la méthode disposer. –

+0

hmm Je ne peux pas dire avec certitude, comme je ne l'ai jamais fait à partir d'une application C++, mais je suppose que vous auriez encore à l'appeler depuis l'application C++. – kemiller2002

2

Lorsque vous fermez le formulaire, il peut ne pas avoir sa méthode Dispose appelé immédiatement par le collecteur des ordures (à moins qu'il vit dans un bloc using).

Cependant, il suffit d'invoquer Dispose méthode de la forme, puisque cette volonté (éventuellement) appeler Dispose sur tous les contrôles dans sa Controls collection (et chaque commande appellera à son tour Dispose sur tous les contrôles dans leur collection Controls etc. on), donc à la fin la méthode Dispose de votre UserControl sera également appelée.

0

Lorsque vous fermez le formulaire, s'il n'a pas ouvert le modèle, le framework appellera sa méthode Dispose. Si elle a été ouverte par un appel à ShowModel, vous devez appeler sa méthode Dispose séparément.

Si votre contrôle UserControl a été ajouté à la collection Controls du formulaire, la méthode Dispose du formulaire est également appelée, puis elle appelle Dispose sur votre contrôle utilisateur.

Questions connexes