2009-07-09 10 views
3

J'ai un WinForms TabControl auquel j'ajoute dynamiquement des TabPages lors de l'exécution. Chaque TabPage contient un contrôle WebBrowser. J'ai également la possibilité de supprimer les TabPages lors de l'exécution.Disposer des contrôles créés dynamiquement

Dois-je déranger() les commandes TabPage et/ou WebBrowser?

Il me semble que je devrais au moins Dispose() le contrôle WebBrowser puisqu'il s'agit d'un peu de ressources.

Répondre

2

Vous devez éliminer() votre page à onglet lorsque vous l'enlevez. Cela va automatiquement disposer tous les contrôles enfants.

Pour plus de détails, consultez la documentation Control.Dispose:

Libère les ressources non managées utilisées par le contrôle et ses contrôles enfants et éventuellement libère les ressources gérées.

La page à onglet dispose également de toutes les commandes enfants.

+0

Je suis allé avec un simple morceau de code comme ceci ... webBrowserTabControl.TabPages.Remove (tabPage); tabPage.Dispose(); Fonctionne bien et ressemble à la fois le contrôle TabPage et WebBrowser sont libérés bien. Merci! –

2

Tout ce que vous allouez qui implémente IDisposable doit avoir Dispose appelé. C'est le but de l'implémentation d'IDisposable.

1

Si vous appelez explicitement Dispose(), il sera généralement nettoyé plus rapidement que si vous ne le faites pas. Si vous êtes préoccupé par les ressources, ou si vos objets conservent d'autres ressources qui pourraient être rares ou en forte demande, c'est toujours une bonne idée d'appeler Dispose() explicitement.

Je recommande toujours cet article de CodeProject pour aider les gens à comprendre correctement le pattern Dispose, et ce à quoi sert Dispose. http://www.codeproject.com/KB/cs/idisposable.aspx

+0

La récupération de place n'est pas identique à l'appel de Dispose. Dispose n'est pas garanti d'être appelé, jamais, et il est généralement mis en œuvre parce qu'une classe utilise une ressource que le GC ne collectera pas, donc il doit être appelé explicitement, peu importe quoi. –

+1

@Ed: C'est seulement un peu vrai. Si vous suivez correctement les consignes de conception, tout objet nécessitant une disposition pour libérer des ressources non gérées doit également fournir un finaliseur qui le fera lorsque le GC finalisera l'objet. Cela nécessite de faire confiance à l'éditeur de composants pour faire les choses correctement, cependant. Pour plus de détails, voir les entrées de mon blog sur IDisposable: http://reedcopsey.com/?p=5 Je vais dans ce détail avec beaucoup de détails. –

+0

C'est vrai, j'ai oublié Finalizers :-) –

Questions connexes