2010-02-06 2 views
4

Simple question ...Remove(), Clear() ou Dispose()

J'ai des contrôles que l'utilisateur peut faire glisser sur mon formulaire lors de l'exécution. Et ils peuvent également les supprimer ... Dois-je simplement appeler .Dispose(); quand ils cliquent sur le bouton de suppression, ou devrais-je faire quelque chose comme panel1.Controls.Clear(Control);? ...Ou autre chose?

Merci de

Bael

Répondre

5

Vous devriez le retirer de la société mère contrôle collection comme décrit dans la réponse de Darin Dimitrov et appellent aussi Éliminez:

panel.Controls.Remove(someControlInstance); 
someControlInstance.Dispose(); 

Vous devez toujours appeler Dispose sur les objets qui mettent en œuvre IDisposable lorsque vous avez terminé avec eux, que toutes les ressources non gérées qu'ils possèdent sont immédiatement libérées. "Sujet à Garbage Coll .." ... Donc, il sera éliminé une fois l'application se termine?

+0

Juste ce que j'espérais entendre. Merci beaucoup Joe. –

2

supprimer juste le contrôle du panneau:

panel.Controls.Remove(someControlInstance); 

Une fois qu'il n'y a plus de références à elle, il sera soumis à la collecte des ordures et des ressources non gérés sera correctement éliminé.

+0

Est-ce que cela ferait une différence (performance sage) si je pouvais en disposer d'une manière ou d'une autre juste après l'avoir enlevé du panneau de contrôle? p.s. Merci pour la réponse :) –

+1

Il ne sera pas éliminé lorsque l'application se termine, mais lorsque le garbage collector fonctionne, ce qui est indéterministe. –

+3

Il sera éliminé lorsque le GC décidera et cela pourrait se produire au milieu de votre application et aussi à la fin. La différence ici est que si vous appelez Dispose() explicitement, la finalisation de l'objet sera exécutée et lors de la prochaine exécution, GC nettoiera la mémoire de l'objet sinon le premier GC placera l'objet dans la file d'attente de finalisation et nettoiera sa mémoire. plus sur le sujet ici: http://msdn.microsoft.com/en-us/library/ms973837.aspx –